SpringCloud-5_模块集群化

时间:2023-03-30 22:05:59

避免一台Server挂掉,影响整个服务,搭建server集群

创建e-commerce-eureka-server-9002微服务模块【作为注册中心】

创建步骤参考e-commerce-eureka-server-9001

修改pom.xml,加入依赖

同9001

创建resources/application.yml

  • 9002的yml

server:
#  修改端口号
  port: 9002
eureka:
  instance:
#    创建主机域名(别名)
    hostname: eureka9002.com
  client:
    #不向注册中心注册自己
    register-with-eureka: false
    #表示自己就是注册中心,作用就是维护注册服务实例,不需要去检索服务
    fetch-registry: false
    service-url:
      #设置与eureka-server9001交互的模块
      defaultZone: http://eureka9001.com:9001/eureka/

创建主启动类EurekaApplication9002.java

类似9001

修改e-commerce-eureka-sever-9001微服务模块

  • 修改9001的yml。只保留了修改部分

#    修改成域名的形式,需要host文件的映射支持
    hostname: eureka9001.com:9001

    service-url:
      #设置与eureka-server9002交互的模块,
      defaultZone: http://eureka9002.com:9002/eureka/

修改hosts.文件

1.文件:C:\Windows\System32\drivers\etc\host

2.文件可以先拷贝到桌面,修改后,再拷贝回去

3.加入内容:

#eureka主机名和ip映射
127.0.0.1 eureka9001.com
127.0.0.1 eureka9002.com

完成测试

启动9001和9002

打开浏览器,分别输入eureka9001.comeureka9002.com,查看服务列表里面是否有对方服务

将member-service-provider-10000注册到EurekaServer集群(目前2台)

  • 9001的域名改了,重新配置

  • 新增了9002的服务群,用逗号“,”分隔后添加

eureka:
  client:
    service-url:
      #表示将自己注册到哪个eureka-server
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

将member-service-consumer-80注册到EurekaServer集群(目前2台)

同上


搭建会员中心服务提供方-provider集群

创建member-service-provider-10002

1.参考member-service-provider-l0000来创建member-service-provider-10002即可

2.创建好后,使用nember-service-provider-10000的源码和配置替换member-service-provider-10002生成的代码(不要到磁盘整体拷贝,会出现关联到member-service-provider-10000的问题,很麻烦,可以创建好新项目的包,然后再拷贝对应包下的文件,就不会出问题)

3.提醒,拷贝时不要忘记拷贝resources/mapper/MemberMapper.xml这些Xxx.xml文件

创建resources/application.yml

修改端口为:10002,name: member-service-provider-10002

修改主启动类名

改为带有10000和10002的类名,便于区分

完成测试

启动eureka server集群(目前2台)

启动member-service-provider--10000

启动member-service-provider-10002

测试页面

注意事项和细节

  1. 因为member.-service-provider-10000和member-service-provider-10002作为一个集群提供服务,因此需要将spring.application.name进行统一,都改为:

name: member-service-provider

  1. 这样消费方通过统一的别名进行负载均衡调用


配置服务消费端consumer-80使用会员中心服务集群

修改MemberConsumerController.java

说明:

1.MEMBER-SERVICE-PROVIDER就是服务提供方【集群】,注册到Eureka Server的名称

2.也就是服务提供方provider【集群】对外暴露的名称为MEMBER-SERVICE-PROVIDER

3.MEMBER-SERVICE-PROVIDER目前有两个Availability Zones member-service-provider:10000

还有一个member-service-provider:10002

需要增加一个注@LoadBalanced赋予RestTemplate负载均衡的能力,也就是会根据你的负载均衡

来选择某个服务去访问,默认是轮询算法,当然我们也可以自己配置负载均衡算法

//private static final String MEMBER_SERVICE_PROVIDER_URL="http://localhost:10000";
    private static final String MEMBER_SERVICE_PROVIDER_URL="http://MEMBER-SERVICE-PROVIDER";

修改CustomizationBean.java

说明:配置注入RestTemplate bean/对象

这里的@LoadBalanced就是赋予RestTemplate负载均衡的能力

默认是使用轮询算法来访问远程调用接口/地址

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){

为了看到测试效果,修改服务提供方

完成测试

启动eureka server集群(目前2台)

启动member-service-provider-10000

启动member-service-provider-10002

不急,先测试:

http://localhost:10000/member/query/1

http://localhost:10002/member/query/1

启动member-service-consumer-80

浏览器访问:http://localhost/member/consumer/query/1

  • 这儿没有端口号是因为,localhost的缺省端口就是80

交替访问member服务说明:

1.注解@LoadBalanced底层是Ribbon支持算法

2.Ribbon和Eureka整合后consumeri直接调用服务而不用再关心地址和端口号,且该服务还有负载功能


获取Eureka Server服务注册信息-DiscoveryClient

需求分析

  • 这里我们以服务消费方,去获取Eureka Server的服务注册信息为例

  • 当然也可以在服务提供方获取Eureka Server的服务注册信息

代码实现

member-service-consumer-80/MemberConsumerController.java

调用getServices()获取服务列表,返回discoveryClient即可在网页显示。其余都是日志显示,用处不大。

    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping("/member/discovery")
    public Object discovery(){
        List<String> services = discoveryClient.getServices();
        for (String service : services) {
            log.info("服务={}",service);
            List<ServiceInstance> instances = discoveryClient.getInstances(service);
            for (ServiceInstance instance : instances) {
                log.info("服务号={},主机号={},端口号={},uri={}",instance.getInstanceId(),
                        instance.getHost(),instance.getPort(),instance.getUri());
            }
        }

        return discoveryClient;
    }

测试

浏览器地址栏输入:http://localhost/member/discovery

注意事项和细节说明

1.在引入DiscoveryClientl时,不要引入错误的包

正确的包,是一个接口:import org.springframework.cloud.client.discovery.DiscoveryClient;

错误的包,是一个类:import com.netflix.discovery.DiscoveryClient;

2.演示的是在服务消费方使用DiscoveryClient来完成服务发现,同样,在服务提供方模块也OK


至此,服务与发现已经完成。接下来是Ribbon负载均衡