# Eureka 注册中心

# 服务调用出现的问题

  • 服务消费者该如何获取服务提供这的地址信息?
  • 如果有多个服务提供者,消费者该如何选择?
  • 消费者如何得知服务提供这的健康状态?

# Eureka 的作用

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

# 搭建 Eureka 服务注册中心

  1. 引入依赖

    <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
  2. 编写启动类,并在启动类添加 **@EnableEurekaServer** 注解

    @SpringBootApplication
    @EnableEurekaServer // 添加注解
    public class EurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class);
        }
    }
  3. 配置文件上添加 eureka 服务器地址信息

    eureka:
      client:
        service-url: 
          defaultZone: http://127.0.0.1:10086/eureka #注册中心地址

# 搭建 Eureka 客户端中心

  1. 引入依赖

    <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     </dependency>
  2. 编写启动类,并在启动类上添加 **@EnableEurekaClient** 注解

    @MapperScan("cn.itcast.user.mapper")
    @SpringBootApplication
    @EnableEurekaClient // 添加注解开启服务注册
    public class UserApplication {
        public static void main(String[] args) {
            SpringApplication.run(UserApplication.class, args);
        }
    }
  3. 配置文件上写明 Eureka 服务端的地址信息

    spring:
     application:
        name: userservice # user 服务的名称
    ## eureka 服务中心
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:10086/eureka

# Eureka 服务发现 / 拉取

  1. 前提:完成 Eureka 服务端和 Eureka 客户端的搭建,并且服务中心可以看到这些注册到 Eureka 的服务

  2. 在原来 RestTemplate 上加入 **@LoadBalanced** 注解

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
  3. 将原来使用 RestTemplate 发送 http 请求时写入的 ip 地址替换成 eureka 服务端中的服务名,即 spring.application.name 字段的名称

    // 2. 利用 restTemplate 发起 http 请求,查询用户 这里原来是 ip 地址,替换成服务名称
    String url = "http://userservice/user/" + order.getUserId();
    User user = restTemplate.getForObject(url, User.class);