Eureka注册中心

服务远程调用问题

    public Order queryById(Long id){
        Order order = orderMapper.findById(id);
        String url = "http://localhost:8081/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
        return order;
    }
  • 出现硬编码
  • 如果有多个服务提供者,消费者如何选择
  • 消费者如何得知服务提供者的状态

服务提供者:一次业务处理过程中,被其它微服务调用的服务(提供接口给其它微服务)

服务消费者:一次业务处理过程中,调用其它微服务的服务(调用其它微服务提供的接口)

Eureka注册中心

Eureka工作流程

1、每一个微服务(服务的提供者和消费者)启动时,就必须向eureka-server中注册自身服务信息

2、当服务消费者需要服务提供者时,会去eureka-server中拉起服务提供者(服务提供者状态都是良好的)的信息

3、服务消费者可以通过负载均衡获取一个服务提供者的信息,远程调用即可

 微服务会定期向eureka-server发送心跳,如果不发送,eureka-server就会移除其服务信息

Eureka作用

  • 消费者该如何获取服务提供者具体信息?
    • 服务提供者启动时向eureka注册自己的信息
    • eureka保存这些信息
    • 消费者根据服务名称向eureka拉取提供者信息
  • 如果有多个服务提供者,消费者该如何选择?
    • 服务消费者利用负载均衡算法,从服务列表中挑选一个
  • 消费者如何感知服务提供者健康状态?
    • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
    • eureka会更新记录服务列表信息,心跳不正常会被剔除
    • 消费者就可以拉取到最新的信息

搭建Eureka

在Eureka架构中,微服务角色有两类:

  • EurekaServer:服务端,注册中心
    • 记录服务信息
    • 心跳监控
  • EurekaClient:客户端
    • Provider:服务提供者
      • 注册自己的信息到EurekaServer
      • 每隔30秒向EurekaServer发送心跳
    • consumer:服务消费者
      • 根据服务名称从EurekaServer拉取服务列表
      • 基于服务列表做负载均衡,选中一个微服务后发起远程调用

搭建EurekaServer

创建项目,添加eureka服务端依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
View Code

编写启动类,开启EurekaServer(@EnableEurekaServer)

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}
View Code

添加application.yml文件

server:
  port: 10081
  
#eureka服务注册
spring:
  application:
    name: eurekaserver #eureka服务名
eureka:
  client:
    service-url:  #eureka地址信息
      defaultZone: http://localhost:10081/eureka

eureka也是个微服务,并把自己也注册到eureka,可以实现eureka集群

defaultZone可以有多个eureka地址信息,中间以逗号隔开

注意:端口号为10080时,会失败,不知到为什么

微服务注册

在微服务项目中添加eureka客户端依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

配置注册信息(微服务名、eureka地址)

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://192.168.223.129:3306/cloud-user?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  application:
    name: userservice
mybatis:
  type-aliases-package: com.marw.pojo
  configuration:
    map-underscore-to-camel-case: true

eureka:
  client:
    service-url:
      defaultZone: http://localhost:10081/eureka/
View Code

将user-service多次启动,模拟多实例部署,为了避免端口冲突,需要修改端口号

 

 

-DServer.port=8083

 

服务发现

修改访问的url路径,用注册到eureka的服务名替换ip和端口

String url = "http://userservice/user/"+order.getUserId();

在实例化RestTemplate方法上添加负载均衡注解(@LoadBalanced)

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

测试效果:

分别访问 http://localhost:8082/order/101 、http://localhost:8082/order/102

原文地址:https://www.cnblogs.com/WarBlog/p/15393521.html