day05-SpringCloud Eureka-服务注册与发现02

打印 上一主题 下一主题

主题 1853|帖子 1853|积分 5559

SpringCloud Eureka-服务注册与发现02

3.搭建EurekaServer集群-实现负载均衡&故障容错

3.1为什么需要集群EurekaServer?


  • 微服务RPC远程服务调用最核心的是高可用
  • 如果注册中心只有1个,如果出现故障,会导致整个服务环境不可用
  • 解决办法就是搭建Eureka注册中心集群,实现负载均衡和故障容错(构成集群的几个主机之间的提供的服务是相同的)
3.2搭建EurekaServer集群

3.2.1搭建第二个注册中心

搭建 e-commerce-eureka-server-9002 微服务模块,作为第二个 EurekaServer -注册中心。
搭建的具体步骤和 e-commerce-eureka-server-9001 一样,见上篇2.2
(1)创建Module,在pom.xml加入相关依赖(略)
(2)创建配置文件application.yml
  1. server:
  2.   port: 9002
  3. #配置Eureka-server
  4. eureka:
  5.   instance:
  6.     hostname: eureka9002.com #服务实例名
  7.   client: #如果Eureka是一个集群,那么相互两个EurekaServer之间也可以当做对方为客户端
  8.     #配置是否向注册中心注册自己
  9.     register-with-eureka: false
  10.     #表示自己就是注册中心,作用是维护注册的服务实例,不需要去检索服务
  11.     fetch-registry: false
  12.     service-url:
  13.       #当前的注册中心 需要注册到 Eureka9001 注册中心
  14.       defaultZone: http://eureka9001.com:9001/eureka/
复制代码
(3)创建主启动类
  1. package com.li.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. /**
  6. * @author 李
  7. * @version 1.0
  8. */
  9. @SpringBootApplication
  10. @EnableEurekaServer
  11. public class EurekaApplication9002 {
  12.     public static void main(String[] args) {
  13.         SpringApplication.run(EurekaApplication9002.class,args);
  14.     }
  15. }
复制代码
3.2.2修改第一个注册中心

(1)修改 e-commerce-eureka-server-9001 的 application.yml 文件
  1. server:
  2.   port: 9001
  3. #配置Eureka-server
  4. eureka:
  5.   instance:
  6.     hostname: eureka9001.com #服务实例名
  7.   client: #如果Eureka是一个集群,那么相互两个EurekaServer之间也可以当做对方为客户端
  8.     #配置是否向注册中心注册自己
  9.     register-with-eureka: false
  10.     #表示自己就是注册中心,作用是维护注册的服务实例,不需要去检索服务
  11.     fetch-registry: false
  12.     service-url: #设置于 Eureka server 的交互模块,查询服务和注册服务都需要依赖这个地址
  13.       #EurekaServer之间相互注册
  14.       defaultZone: http://eureka9002.com:9002/eureka/
复制代码
(2)将e-commerce-eureka-server-9001的主启动类的名称修改为 EurekaApplication9001
3.2.3修改host文件

因为是在一台电脑上模拟的集群,为了浏览器输入类似eureka9002.com:9002/eureka/的地址,可以直接访问到,这里修改host文件,对上述指定域名进行本机的ip映射。
文件位置:C:\Windows\System32\drivers\etc\hosts
3.2.4完成测试

分别启动两个注册中心,在浏览器中访问上图配置的地址:
3.3.5将其他微服务注册到EurekaServer集群

(1)将member-service-provider-10000注册到 EurekaServer 集群
部分配置:
  1. eureka:
  2.     service-url:
  3.       #将本微服务注册到多个EurekaServer,使用逗号间隔
  4.       defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
复制代码
(2)将member-service-consumer-80注册到 EurekaServer 集群:同上,修改位置相同(略)。
(3)启动这些微服务,可以看到在所有EurekaServer的监控页面中都注册了上述微服务:
3.3搭建会员中心服务提供方集群

同样的,为了高可用性,我们不仅在EurekaServer中要使用集群,在服务提供方也要使用集群(构成集群的几个主机之间的提供的服务是相同的)。
3.3.1搭建第二个服务提供方

所以参考 member-service-provider-10000 的代码来创建 member-service-provider-10002 ,以下简称为10000 和 10002
(1)创建Module-member-service-provider-10002
(2)可以将磁盘下10000子模块的main目录复制替换10002的main目录
(3)然后在10002的pom.xml中导入和10000的pom.xml相同的依赖
(4)最后修改10002的端口和当前应用的名称,并修改10002的主程序名称。
(5)测试
3.3.2注意事项和细节

因为member-service-provider-10000和member-service-provider-10002是作为一个集群对外提供服务的,因为我们需要将两个微服务的spring.application.name进行统一,这样消费方可以通过统一的别名进行负载均衡调用。
  1. spring:
  2.   application:
  3.     name: member-service-provider #同一将服务提供方的应用名设置为member-service-provider
复制代码
设置后,重新启动服务启动方,在EurekaServer中可以看到注册列表中只有一个服务提供名,但是它包含了两个远程调用的接口:
3.4配置服务消费端使用会员中心服务集群

配置服务消费端 member-service-consumer-80,让它可以使用会员中心服务集群。
(1)修改MemberConsumerController.java
  1. package com.li.springcloud.controller;
  2. import ...
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. */
  7. @RestController
  8. @Slf4j
  9. public class MemberConsumerController {
  10.     @Resource
  11.     private RestTemplate restTemplate;
  12.     /**
  13.      * 1.MEMBER-SERVICE-PROVIDER 是服务提供方[集群]注册到EurekaServer的别名
  14.      * 2.也是服务提供方[集群]对方暴露的名称
  15.      * 3.这里MEMBER-SERVICE-PROVIDER 目前有两个可以获取的区域:
  16.      *   member-service-provider-10000、member-service-provider-10002
  17.      */
  18.     public static final String MEMBER_SERVICE_PROVIDER_URL =
  19.             "http://MEMBER-SERVICE-PROVIDER";//改为提供服务模块的别名
  20.     //添加对象到数据库表中
  21.     @PostMapping("/member/consumer/save")
  22.     public Result<Member> save(Member member) {
  23.         return restTemplate.postForObject
  24.                 (MEMBER_SERVICE_PROVIDER_URL + "/member/save",
  25.                         member,
  26.                         Result.class);
  27.     }
  28.    
  29.     //根据id调用服务接口,返回member对象信息
  30.     @GetMapping("/member/consumer/get/{id}")
  31.     public Result<Member> getMemberById(@PathVariable("id") Integer id) {
  32.         return restTemplate.getForObject
  33.                 (MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id,
  34.                         Result.class);
  35.     }
  36. }
复制代码
(2)修改 CustomInitBean.java
需要增加注解 @LoadBalanced,赋予 RestTemplate负载均衡能力,即选择 MEMBER-SERVICE-PROVIDER 某一个服务访问,默认是轮询算法
  1. package com.li.springcloud.config;
  2. import ...
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. * 注入RestTemplate Bean
  7. */
  8. @Configuration
  9. public class CustomInitBean {
  10.     @Bean
  11.     @LoadBalanced //赋予RestTemplate负载均衡的能力,默认是使用轮询算法来访问远程调用接口
  12.     public RestTemplate getRestTemplate() {
  13.         return new RestTemplate();
  14.     }
  15. }
复制代码
(3)依次启动EurekaServer集群、服务提供方集群、服务消费方
为了区分,可以在服务提供方的Controller中打印当前的服务提供方的名称


  • 先用浏览器直接访问服务提供方集群的接口,目的是测试服务提供方是否正常工作:
    注意这里访问的分别是不同的服务提供方的接口



  • 在用浏览器访问服务消费方的接口,测试服务消费方是否正常工作:
    可以看到浏览器访问同一个地址(即只有一个服务消费方模块),但是底层调用的服务提供方是不一样的(轮询访问)
    第一次访问:

第二次访问:
交替访问member服务说明:

  • 注解 @LoadBalanced底层是Ribbon支持算法
  • Ribbon和Eureka整合后,服务消费方可以直接调用服务,而不用再关心服务提供方的地址和端口号
  • 该服务还有负载功能
3.5通过DiscoveryClient获取EurekaServer服务注册信息

无论是服务消费方还是服务提供方,它们都是EurekaClient。如果希望获取到EurekaServer的服务注册信息,可以使用DiscoveryClient。
这里以服务消费方为例,获取EurekaServer的服务注册信息:
(1)修改 MemberConsumerController.java
  1. package com.li.springcloud.controller;
  2. import ...
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. */
  7. @RestController
  8. @Slf4j
  9. public class MemberConsumerController {
  10.     @Resource
  11.     private RestTemplate restTemplate;
  12.     //装配一个DiscoveryClient,
  13.     //注意用的包是 import org.springframework.cloud.client.discovery.DiscoveryClient;
  14.     @Resource
  15.     private DiscoveryClient discoveryClient;
  16.     @GetMapping("/member/consumer/discovery")
  17.     public Object discovery() {
  18.         List<String> services = discoveryClient.getServices();
  19.         for (String service : services) {
  20.             log.info("服务名={}", service);
  21.             //通过服务名来获取服务名对应的实例
  22.             List<ServiceInstance> instances = discoveryClient.getInstances(service);
  23.             for (ServiceInstance instance : instances) {
  24.                 log.info("id={},host={},port={},uri={}",
  25.                         instance.getServiceId(), instance.getHost(),
  26.                          instance.getPort(), instance.getUri());
  27.             }
  28.         }
  29.         return discoveryClient;
  30.     }
  31.    
  32.     //其他方法略..
  33. }
复制代码
(2)修改启动类,添加注解启用服务发现
(3)重启服务消费模块,浏览器访问 http://localhost/member/consumer/discovery,后台输出如下:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表