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);