计算机系统应用教程网站

网站首页 > 技术文章 正文

SpringCloud-eureka高可用注册中心

btikc 2024-09-20 14:50:36 技术文章 18 ℃ 0 评论

在分布式环境中,需要充分考虑发生故障的情况,在生产环境中必须要高可用的部署。

上一篇文章中,eureka server是单一的服务,所以不需要注册自己,但在集群环境中,需要eureka server相互注册,所以下面2项要注意了

# 关闭自己注册自己
eureka.client.register-with-eureka=false
# 不需要检索服务
eureka.client.fetch-registry=false

在eureka server里增加2个配置文件:application-peer1,application-peer2如下

application-peer1.properties 建议使用域名,就要先修改hosts文件。

spring.application.name=eureka-server
server.port=1111
eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:1112/eureka/

application-peer2.properties

spring.application.name=eureka-server
server.port=1112
eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/

请注意了,这2个配置文件是相互注册的,你中有我,我中有你。

下面启动2个eureka server:

java -jar eureka-server.jar --spring.profiles.active=peer1
java -jar eureka-server.jar --spring.profiles.active=peer2

启动服务,可以查看控台:http://peer1:1111/和http://peer2:1112/

eureka.png

可以在registered-replicas看到都相互注册了,available-replicas可用分片中可以看到相应的节点,停止一个另一个还可以工作,如下图:

eureka2.png

关闭一个server后,如上图有一个DOWN,若关闭保护模式,一会这个服务将会被清除掉。

若available-replicas没有相应节点,则是因为eureka.client.register-with-eureka/eureka.client.fetch-registry为false,可以把application.properties中改为true,或在peer配置文件中改为true,默认就为true。

上面即实现了注册中心的高可用,下面提供服务给注册中心。跟上一章中构建服务一样,创建一个服务后打包生成jar,然后启动服务并注册到所有注册中心上。

# 高可用
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer1:1111/eureka/

启动多个服务

java -jar eureka-client.jar --server.port=8081
java -jar eureka-client.jar --server.port=8082

启动后,刷新peer1/peer2控制台,可以看到2个服务,也可以调用服务测试接口http://desktop-7brumlo:8081/hello

有了高可用注册中心,也提供了服务,接下来是消费服务了。

下面通过ribbon消费服务提供者,可通过日志查看ribbon的负载均衡状态。

创建一个gradle工程,配置文件如下:

dependencyManagement {

imports {

mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Edgware.SR4'

}

}

dependencies {

compile('org.springframework.boot:spring-boot-starter')

compile('org.springframework.boot:spring-boot-starter-web')

compile('org.springframework.boot:spring-boot-starter-actuator')

compile 'org.slf4j:slf4j-api:1.7.14'

compile('org.springframework.cloud:spring-cloud-starter-hystrix')

compile('org.springframework.cloud:spring-cloud-starter-eureka')

compile('org.springframework.cloud:spring-cloud-starter-ribbon')

testCompile('org.springframework.boot:spring-boot-starter-test')

}

application.properties文件如下:

spring.application.name=ribbon-consumer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer1:1111/eureka/
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000

上面配置了熔断的时间间隔为2000毫秒。

在启动类上添加超时熔断标签,如下:

@EnableCircuitBreaker //超时熔断
@EnableDiscoveryClient
@SpringBootApplication
public class CloudApplication {
 @Bean
 @LoadBalanced //请求时拥有客户端负载均衡的能力
 RestTemplate restTemplate() {
 return new RestTemplate();
 }
 public static void main(String[] args) {
 SpringApplication.run(CloudApplication.class, args);
 }
}

创建消费controller,如下:

@RestController
public class ConsumerController {
 @Autowired
 HelloService helloService;
 @GetMapping(value = "/ribbon-consumer")
 public String helloConsumer() {
 return helloService.hello();
 }
}

最后创建service,调用要消费的服务,如下:

@Service
public class HelloService {
 @Autowired
 RestTemplate restTemplate;
 @HystrixCommand(fallbackMethod = "helloFallback", commandKey = "helloKey")
 public String hello() {
 StringBuilder result = new StringBuilder();
 // GET
 result.append(restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody()).append("<br>");
 result.append(restTemplate.getForEntity("http://HELLO-SERVICE/hello1?name={1}", String.class, "didi").getBody()).append("<br>");
 return result.toString();

启动消费服务后,消费服务http://localhost:9000/ribbon-consumer,可以看到以下日志

DynamicServerListLoadBalancer for client HELLO-SERVICE initialized: DynamicServerListLoadBalancer:
{NFLoadBalancer:name=HELLO-SERVICE,current list of Servers=[DESKTOP-7BRUMLO:8082, DESKTOP-7BRUMLO:8081],
Load balancer stats=Zone stats: {
defaultzone=[Zone:defaultzone; Instance count:2; 
Active connections count: 0; Circuit breaker tripped count: 0;
Active connections per server: 0.0;]

日志上可以看到ribbon客户端维护的SERVICE的服务列表,就按此信息轮询访问,以实现基于客户端的负载均衡。

若停掉一个服务,可以看到ribbon会启动熔断机制,过一会后就可以正常访问了,所有请求落到另一个服务上;若2个服务都正常,可以观察服务输出日志是按轮询方式输出的。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表