07月10, 2018

Spring Cloud [01_服务注册_Eureka]

Spring Cloud作为微服务分布式组件集合,集成了各种开箱即用的分布式项目构建的解决方案。其中又以服务治理的注册中心Eureka为组件核心。

Eureka-Server

Eureka-Server为注册中心的服务端,负责为Eureka-Client提供注册与服务订阅。

准备工作

首先在Spring Initializer创建spring-boot项目。 加入Eurek-Server依赖:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

spring-boot与spring-cloud的版本对应

集群

Eureka-Server为整个服务治理体系的核心组件,因此集群化是保证服务高可用性的比较条件。

以3节点集群为例:

  • 每个节点分别向其它2个节点注册服务,组成集群 alt

  • application.yaml文件中以profiles区分,配置node01、node02、node03三套环境。

---
spring:
  profiles: node_01
  application:
    name: eureka_server

server:
  port: 8701

eureka:
  instance:
    hostname: node01
  client:
    #  eureka-server本身也会被做为服务进行注册
    #   register-with-eureka: false
    #  注册中心地址(注册至节点02,03)
    serviceUrl:
      defaultZone: http://node02:8702/eureka/,http://node03:8703/eureka/
  • 其它参数

eureka.client.register-with-eureka :Eruka-Server默认会将自己也当作服务注册至用户中心。

eureka.client.fetch-registry: 定时从注册中心抓取服务列表。

eureka.client.serviceUrl.defaultZone :注册中心注册地址。

  • 增加启动注解 启动Eruka-Server:@EnableEurekaServer

  • 分别启动服务

利用--spring.profiles.active=node_03参数指定生效环境。

alt

Node01 可以看到Node02 Node03的地址,其它节点同理,注册中心集群搭建完毕。

Eruka-Client

Eruka客户端为服务的提供者,在启动时向用户中心注册地址并通过心跳保持可用状态。

  • 配置注册中心地址:
 eureka:
  client:
    serviceUrl:
      # 向注册中心节点注册服务
      defaultZone:  http://node01:8701/eureka/
  • 开启服务注册: @EnableDiscoveryClient

启动服务后,因为注册中心集群的存在,所以即使服务只向node01节点注册了服务,节点node02 node03也会注册成功。

  • Node01:

    alt

  • Node02:

    alt

  • Node03:

    alt

RestTemplate With Ribbon

Spring内置的Http组件RestTemplate集成了负载均衡组件Ribbon,配合Eureka可以轻松的实现各种策略的服务负载。

  • 模拟启动3个节点的服务
spring:
  application:
    name: bar-service

eureka:
  client:
      serviceUrl:
      # 向注册中心注册服务
        defaultZone: http://node01:8701/eureka/
---
server:
  port: 7001
spring:
  profiles: server01
---
server:
  port: 7002
spring:
  profiles: server02
---
server:
  port: 7003
spring:
  profiles: server03
  • 向Eureka注册

alt

  • 客户端设置RestTemplate
@Bean
@LoadBalanced
RestTemplate restTemplate(){
    return new RestTemplate();
}

@LoadBalancedRestTemplate利用Ribbon实现客户端负载。

  • 客户端利用RestTemplate发送请求
restTemplate.getForEntity("http://BAR-SERVICE/call",String.class).getBody();

url的domain用Eureka注册服务的applica.name代替以实现动态负载。

负载策略

默认情况下,Ribbon采用轮训的方式调用可用服务地址。

got request from: 7001 got request from: 7002 got request from: 7003

参照Spring文档可配置ribbon负载策略。

更改成随机负载策略:

BAR-SERVICE:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

got request from: 7003 got request from: 7002 got request from: 7003 got request from: 7002 got request from: 7001

更多策略:com.netflix.loadbalancer.AbstractLoadBalancerRule 相关子类。


参考:

  1. 源码
  2. SpringCloud中文

本文链接:https://check321.net/post/springcloud_eureka.html

-- EOF --

Comments

请在后台配置评论类型和相关的值。