03-Eureka注册中心

三、Eureka注册中心

  • 假如本案例的服务提供者user-service部署了多个实例,如图所示
  • 那么就会带来如下几个问题
    • ①、order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
    • ②、有多个user-service实例地址,order-service调用时该如何选择?
    • ③、order-service如何得知某个user-service实例是否正常,或者宕机?

3.1、Eureka的结构和作用

  • 上述提到的问题,那么就不得不提到Spring Cloud中的注册中心,其中最广为人知的注册中心就是Eureka,其结构如下所示
  • 问题1:order-service如何得知user-service实例地址?
    • 获取地址信息的流程如下
      • ①、user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册
      • ②、eureka-server保存服务名称到服务实例地址列表的映射关系
      • ③、order-service根据服务名称,拉取实例地址列表。这个叫服务发现或者服务拉取
  • 问题2:order-service如何从多个user-service实例中选择具体的实例?
    • ①、order-service从实例列表中利用负载均衡算法选中一个实例地址
    • ②、向该实例地址发起远程调用
  • 问题3:order-service如何得知某个user-service实例是否正常,或者宕机?
    • ①、user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己的状态,称为心跳
    • ②、当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
    • ③、order-service拉取服务的时候,就能将故障实例派出了

注意事项

  • 一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端

3.2、搭建eureka-server

3.2.1、创建eureka-server服务

  • 在cloud-demo父工程下,创建一个子模块,如下所示

3.2.2、引入eureka依赖

  • 引入SpringCloud为eureka提供的starter服务器端依赖

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

3.2.3、编写启动类

  • 给eureka-server服务编写一个启动类,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能

    • package cn.coolman;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
      @SpringBootApplication
      @EnableEurekaServer
      public class EurekaApplication {
      public static void main(String[] args) {
      SpringApplication.run(EurekaApplication.class, args);
      }
      }

3.2.4、编写配置文件

  • 编写一个applicaiton.yml文件,编写的内容如下所示

    • 1、服务器端口号
    • 2、服务器的服务名
    • 3、注册中心的访问地址(最后一项defaultZone需要手动敲上去,并且URL地址前面有空格)
  • # 服务器端口号
    server:
    port: 10086
    spring:
    application:
    name: eureka-server
    # 注册中心服务的访问地址
    eureka:
    client:
    service-url:
    defaultZone: http://localhost:10086/eureka

3.2.5、启动服务

3.3、服务注册

  • 接下来,我们就可以将user-service注册到eureka-server中去(先开启服务器端,在开启客户端)

3.3.1、引入依赖

  • 在user-service的pom文件,引入下面的eureka-client客户端依赖

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

3.3.2、修改配置文件

  • 在user-service中,修改applicaiton.yml文件
    • ①、添加服务器名称:userservice(微服务名称中没有短横)
    • ②、eureka的访问地址,与服务器端的访问地址相同(后面的defalutZone需要手动敲上去)

3.3.3、启动多个user-service实例

  • 为了演示一个服务有多个实例的场景,可以添加一个SpringBoot的启动配置,再启动n个user-service
    • ①、修改server.port的值参数
    • ②、编辑运行时jvm的参数
    • ③、复制一个相同的程序并且修改端口
  • 重启所有user-service服务,刷新查看eureka-server管理界面

3.4、服务发现

  • 下面,我们将order-service的逻辑修改一下
    • 向eureka-server拉取user-service的信息,实现服务发现

3.4.1、引入依赖

  • 之前说过,服务发现、服务注册统一都封装台eureka-client依赖,因此这一步与服务注册一致

  • 在order-service的pom文件中,引入下面的eureka-client客户端依赖

    • <!-- eureka客户端 -->
      <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>

3.4.2、修改配置文件

  • 服务发现也需要知道eureka地址,因此第二部与服务注册一样,都是配置eureka信息

  • 同时添加服务名称orderservice

  • application:
    name: orderservice
    eureka:
    client:
    service-url:
    defalutZone: http://localhost:10086/eureka

3.4.3、服务拉取和负载均衡

  • 最后,需要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡

  • 不过这些动作并不需要我们去实现,只需要添加一些注解即可

    • ①、在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解(LoadBalance中文意思是负载均衡)

    • ②、修改order-service服务中的cn.coolman.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务器名替代IP、端口

      • @GetMapping("{orderId}")
        public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        // 根据id查询订单并返回
        Order order = orderService.queryOrderById(orderId);
        // User user = restTemplate.getForObject("http://localhost:8081/user/" + order.getUserId(), User.class);
        User user = restTemplate.getForObject("http://userservice/user/" + order.getUserId(), User.class);
        order.setUser(user);
        return order;
        }
      • Spring会自动帮助我们从eureka-server端,根据user-service这个服务名称,获取实例列表,而后完成负载均衡

    • ③、启动orderservice服务,查看eureka管理界面

    • ④、再次访问order的微服务(访问六次)

    • ⑤、查看此时eureka的负载均衡,是分配到了哪个user-service

      • 最终发现,三个user-service服务,都分配到了两次请求,由此可见Eureka的负载均衡默认是轮询
posted @   OnlyOnYourself-Lzw  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示