2020-11-24 Eureka服务集群部署

Eureka 服务端集群

服务集群部署可以在 Eureka项目构筑基础上调整得到。
Eureka服务之间彼此互相注册
配置文件如:
端口7001 Eureka服务yml配置。service-url 指向了端口7002的Eureka . 其服务器的别名从原先的单体localhost 变成了 eurekaXXX.com 形式的域名方式

server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001.com
  client:
    #不向注册中心注册自己
    register-with-eureka: false
    #自己已经是注册中心,不需要去检索服务
    fetch-registry: false
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/

端口7002 Eureka服务yml配置 与7001类似,唯一不同的是指向的 service-url 地址变成了7001 端口所在的服务器。

如果要部署2台以上的Eureka服务,可以在defaultZone 往后继续填写,Eureka服务URL ,service-url值是一个Map,可以传入多个值。

完成上述步骤之后打开 链接 http://eureka7001.com:7001 或 http://eureka7002.com:7002
可以看到如下效果

Eureka集群7001

发现两个Eureka服务互相指向对方

Eureka 客户端集群

单体项目中此前采用写死的代码让 cloud-order-service 调用 cloud-payment-service

    public static final String PAYMENT_URL="http://localhost:8001";
   @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult getPayment(@PathVariable("id")Long id){
        return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
    }

这种方式存在不小的问题,服务8001一旦挂掉整个cloud-order-service的服务功能也会跟着无法使用,在集成了Eureka后,可以使用域名对cloud-payment-service 进行调用。代码上的调整也简单。
首先需要对服务cloud-payment-service 部署到Eureka上。
配置修改(以8001为例。8002服务类似)

server:
  port: 8001
spring:
  application:
    name: cloud-payment-service
   ...常规的配置
eureka:
  client:
    #是否把自己注册进EurekaServer 默认为true
    register-with-eureka: true
    #是否从Eureka抓取已有的注册信息,默认true 单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

8001与8002服务使用的spring.application.name均为 cloud-payment-service,这与Eureka服务器不一样,Eureka服务器这需要其eureka.instance.hostname 命名有一定的区分,作为客户端,它需要把全部的Eureka服务器端的url注册到自己的配置文件中。
对代码方面的调整:
控制器层面使用服务名访问服务:

    public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
  @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult getPayment(@PathVariable("id")Long id){
        return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
    }

在部署了集群的服务上,需要对RestTemplate 的调用指定一下访问策略。需要在配置文件进行调整:

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

在未指定的情况下,会出现异常报错:

java.net.UnknownHostException: CLOUD-PAYMENT-SERVICE
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:220) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:609) ~[na:na]
...其后省略

你可能感兴趣的:(2020-11-24 Eureka服务集群部署)