SpringCloud之Eureka(二)

版权声明:可转载,需注明出处 https://blog.csdn.net/tigerJGG/article/details/89212086

目录

前言

实现高可用注册中心

前言

SpringCloud之Eureka(一)中,简单的配置了Eureka的单节点注册中心,但是在分布式环境中,我们需要充分考虑发生故障的情况,需要一些高可用方案。在这篇文章中,我将会构建一个高可用的Eureka服务注册中心。

Eureka Server的高可用方案实际上就是将自己作为服务向其他注册中心注册自己,这样就形成一组互相注册的服务注册中心,可以实现服务清单的相互同步,达到高可用效果。

实现高可用注册中心

  • 1.仿照之前的步骤再创建一个注册中心

之前配置单节点注册中心时,使用了eureka.client.fetch-registry=false和eureka.client.register-with-eureka=false,但是在高可用环境下,需要将自身注册到其他的注册中心,因此需要将这两个配置去除,这两个配置默认为true,全部配置如下所示:

#server1配置
#高可用下节点名字要一致
spring.application.name=server
#Eureka-Server配置
eureka.instance.hostname=server1
server.port=8089
#高可用时,此时不能使用localhost,指向别的注册中心地址
eureka.client.serviceUrl.defaultZone=http://server2:8087/eureka/


#server2配置
#高可用下节点名字要一致
spring.application.name=server
server.port=8087
#Eureka-Server配置
eureka.instance.hostname=server2
eureka.client.serviceUrl.defaultZone  = http://server1:8089/eureka/
  • 2.启动注册中心

启动两个注册中心之后,通过访问注册中心地址可以看到如下所示,Instances currently registered with Eureka出现了SERVER属性,并包含两个注册中心的地址,如果此时关闭其中一个注册中心,那么它的地址将被添加到unavailable-replicas属性值。

  • 3.配置服务提供者

在高可用注册中心下,服务提供者需要配置多个注册中心地址,配置如下:

扫描二维码关注公众号,回复: 5923935 查看本文章
spring.application.name=client
server.port = 1111
#指定服务注册地址
eureka.client.serviceUrl.defaultZone  = http://localhost:8090/eureka/,http://localhost:8087/eureka/

启动该服务之后,可以在两个注册中心页面看到该服务已经被注册到server1和server2上。可以使用另一个端口启动该服务,表示同一个服务可以由多个提供者同时提供。

  • 4.配置服务消费者

现在开始构建一个服务消费者,主要包含服务发现和服务消费,服务发现是由Eureka客户端完成的,而服务消费的任务是由Ribbon完成。Ribbon实在Eureka服务发现的基础上,实现了一套对服务实例的选择策略。

1)在之前服务提供者pom.xml基础上,添加Ribbon模块依赖spring-cloud-starter-ribbon,并配置properties文件。

<!--Ribbon-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
#properties
#高可用下节点名字要一致
spring.application.name=consumer

server.port=1118
#Eureka-Server配置
eureka.instance.hostname=consumer1
eureka.client.serviceUrl.defaultZone  = http://localhost:8090/eureka/,http://localhost:8087/eureka/

2)在启动类上添加@EnableDiscoveryClient注解,让该应用注册为Eureka客户端应用,以获得服务发现的能力。同时添加一个RestTmplate的Bean实例,通过@LoadBalanced注解开启客户端负载均衡。

@EnableDiscoveryClient
@SpringBootApplication
public class DemoApplication {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTempage(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

3)创建Controller,实现方法对服务提供者的test方法进行调用,这里通过上面注入的RestTemplate实例调用服务提供者方法,需要注意的是,调用的url不是通过具体的ip和端口号,而是通过服务提供者的服务名(不区分大小写)。

@RestController
public class TempController {
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/consumerGet")
    public String temp(){
        return restTemplate.getForEntity("http://PRODUCER/get",String.class).getBody();
    }
}

4)启动消费者应用之后,可以调用http://localhost:1118/consumerGet可以获取服务提供者方法的返回值,并且可以在消费者控制台看到以下打印信息,包含服务提供者列表,各个实例请求总数量,第一次连接信息,上一次连接信息,总的请求失败量等。

 

如果多次调用,可以在两个服务提供者控制台看到负载均衡起到作用,我调用了五次然后服务提供者控制台情况显示如下:

猜你喜欢

转载自blog.csdn.net/tigerJGG/article/details/89212086