SpringCloud eureka整合

主要内容eureka的介绍及其优势,单机版eureka server、server provide、server consume三要素搭建,以及eureka高可用集群搭建。拓展region和zone。

Eureka作为Netflix的一个核心模块之一,遵循AP原则即高可用和容错性;本身由java编写完成,是一个基于REST的服务,用于定位服务,以实现云端中间层服务的负载均衡和故障转移的目的;Spring Cloud将它集成在其他子项目spring-cloud-netflix中,以实现spring cloud服务发现功能。类似于dubbo的注册中心(Zookeeper)。

CAP原则:CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼,最多只能3选2。

Eureka采用C/S架构。通过@EnableEurekaServer,@EnableEurekaClient两注解开启该服务作为Eureka服务端还是客户端使用。基础架构可分成**三个核心要素**Eureka Server作为注册中心,Service Provider作为服务提供者,Service Consumer作为服务消费方,ServiceProvider和ServiceConsumer同为EurekaServer的客户端,三者之间的关系可如下图所示:

这里写图片描述

三个核心要素基本功能

  • Eureka Server:提供服务注册和发现(响应失效剔除、自我保护);

  • Service Provider:服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到(向注册中心服务注册、服务同步、服务续约);

  • Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务(往注册中心获取服务、服务调用、服务下线)。

为了让Eureka Server知道客户端是否还活着,引入了心跳机制,即每隔一定时间(默认30s)都会告知Eureka Server我还活着,防止“剔除任务”将服务实例从服务列表中排除出去。如果发现一个服务死了,Eureka不会将其注册信息直接删除而是尽可能当前实例的注册信息保护起来即进入自我保护阶段(默认自我保护为开启,可以通过eureka.server.enable-self-preservation=false关闭自我保护)。SpringCloud的一些其它模块(比如Ribbon、Zuul等)可以通过Eureka Server来发现系统中其他微服务,做相关的逻辑处理。

Eureka与ZooKeeper对比

Eureka是基于AP原则构建,而ZooKeeper是基于CP原则构建;ZooKeeper基于CP,不保证高可用,如果zookeeper正在选举或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。作为注册中心,其实配置是不经常变动的,只有发版和机器出故障时会变。对于不经常变动的配置来说,CP是不合适的,而AP在遇到问题时可以用牺牲一致性来保证可用性,既返回旧数据,缓存数据。
所以理论上Eureka是更适合作注册中心。而现实环境中大部分项目可能会使用ZooKeeper,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况,所以实际上也没什么大问题。

SpringCloud集成Eureka

1. Eureka单机

1. Eureka Server实现

  • 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  • 开启Eureka服务
    在主启动类添加@EnableEurekaServer注解,开启该服务作为Eureka服务端。
@EnableEurekaServer
@SpringBootApplication
public class EurekaserverzeroApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaserverzeroApplication.class, args);
    }
}
  • 配置
server:
  port: 9990
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

eureka.client.register-with-eureka:由于服务本身就为注册中心,因此不需要注册自己,所有设置为false;

eureka.client.fetch-registry:由于注册中心的职责就是维护服务实例,不需要去检索服务,所有设置为false;

** eureka.client.serviceUrl.defaultZone:** 服务注册中心的配置内容,指定服务注册中心的位置。
  • 启动服务
    启动后,访问http://localhost:9990进入到控制台,可看到如下页面
    这里写图片描述
    代表Eurekar Server实现完成。

2. Service Provider实现

  • 添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.0.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

web依赖一定要加,否则会出现启动后就挂了,因为无法进行心跳,导致服务自行关闭。

```
    DiscoveryClient_SERVICEPROVIDER/hgspc:serviceprovider:8001 - registration status: 204
    com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SERVICEPROVIDER/hgspc:serviceprovider:8001: registering service...
    com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SERVICEPROVIDER/hgspc:serviceprovider:8001 - registration status: 204
    com.netflix.discovery.DiscoveryClient    : Unregistering ...
    com.netflix.discovery.DiscoveryClient    : DiscoveryClient_SERVICEPROVIDER/hgspc:serviceprovider:8001 - deregister  status: 200
    com.netflix.discovery.DiscoveryClient    : Completed shut down of DiscoveryClient
```
  • 开启Eureka客户端

在主启动类添加@EnableEurekaClient注解,开启该服务作为Eureka客户端。

@EnableEurekaClient
@SpringBootApplication
public class EurekaserverzeroApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaserverzeroApplication.class, args);
    }
}

@EnableEurekaClient与@EnableDiscoveryClient
你会发现很多书籍或者文章用到的注解为@EnableDiscoveryClient而不是@EnableEurekaClient,这两者都可以。@EnableEurekaClient该组合注解包含了@EnableDiscoveryClient注解不过Finchley.RELEASE版本及之后两者不在是包含关系,spring cloud中discovery service有许多种实现(eureka、consul、zookeeper等等),@EnableDiscoveryClient基于spring-cloud-commons, @EnableEurekaClient基于spring-cloud-netflix,更简单的说就是如果选用的注册中心是eureka,那么推荐@EnableEurekaClient,如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient。

  • 配置
server:
  port: 8001
spring:
  application:
      name: serviceprovider
eureka:
  client:
    serviceUrl:
        defaultZone: http://localhost:9990/eureka/
  • 添加一个接口
    该接口主要用于消费端消费测试用。
@RestController
    public class HelloController {
    @GetMapping("/hello")
        public Object hello(){
        return "hello,I'am service provider zero";
    }
}
  • 结果
    启动后,再回到控制台,可以看到serviceprovider成功注册到Eureka server
    这里写图片描述
    同时我们也可以再Eureka server日志中看到注册日志:

     c.n.e.registry.AbstractInstanceRegistry  : Registered instance SERVICEPROVIDER/hgspc:serviceprovider:8001 with status UP (replication=false)
    

3. Service Consumer实现
有了Eureka Server和Service provider,现在就缺消费端来消费服务了。要知道Service Consumer和Service provider一样都属于客户端,因此配置上与Service provider基本相同,端口设置不同即可,通常情况下Service provider后台会有好几台服务,consumer可以引入Ribbon实现客户端的负载均衡,服务列表便是借助Eureka的获取服务清单,进行相应策略的调用。

  • 准备
    copy一个Server Provider ,将其端口改成8002,并修改controller打印的内容即可,启动,此时便有两台服务提供者。需要注意这两台服务的spring.application.name需要设置成相同的,这里使用serviceprovider,两台Service Provide启动成功后,可在控制台看到8001、8002两台up的服务。
    这里写图片描述

Service Consumer

  • 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 配置
spring:
  application:
    name: ribbon-consume
eureka:
  client:
    serviceUrl:
        defaultZone: http://localhost:9990/eureka/
  • 开启Eureka客户端
@Configuration
@EnableDiscoveryClient
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

在RestTemplate的bean上添加@LoadBalanced注解即可开启客户端负载均衡,就是这么简单。

  • 消费server
@RestController
@RequestMapping("/consume")
public class HelloController {
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/hello")
    public Object hello(){
        String object = restTemplate.getForObject("http://serviceprovider/hello", String.class);
        return object;
    }
}

可以看到消费的地址是http://serviceprovider/hello 而不是具体的地址端口,serviceprovider为我们服务提供者配置的spring.application.name: serviceprovider所以该配置非常重要。

这便体现出ribbon的作用,ribbon默认的负载均衡策略为一一轮询,这里不做更多的说明。

4. Eureka集群

  1. Eureka Server实现
    单机版已经无法满足当下的需求,搭建Eureka集群非常有必要。这里以两台eureka server进行测试。
    为了方便测试在host中配置两个域名指向 127.0.0.1(windows)

    127.0.0.1 localhost eureka1 eureka2

两台服务唯一区别在于配置,其它完全一致,直接copy修改下配置即可,不在给出。

服务1配置:

server:
  port: 9990
eureka:
  instance:
    hostname: eureka1
  client:
    register-with-eureka: false
    fetch-registry: false
    serviceUrl:
          defaultZone: http://eureka2:9991/eureka/

服务2配置:

server:
  port: 9991
eureka:
  instance:
    hostname: eureka1
  client:
    register-with-eureka: false
    fetch-registry: false
    serviceUrl:
          defaultZone: http://eureka1:9990/eureka/

可以看到defaultZone需要指向对方的defaultZone地址,这样两个服务会同属于一个zone,在控制台页面可以看到对方的服务。
这里写图片描述

同样client端也需要修改defaultZone指向这两台服务,重启一下便可在两个Eureka server控制台中看到clien端的注册信息。

eureka:
  client:
    serviceUrl:
        defaultZone: http://eureka1:9990/eureka/,http://eureka2:9991/eureka/

这样两个服务构成的集群就搭好了。就是这么简单。

6.拓展

region和zone

前面配置中会看到defaultZone这样一个配置,该配置就是用于配置zone。
eureka提供了region和zone两个概念来进行分区,这两个概念均来自于亚马逊的AWS(http://blog.csdn.net/awschina/article/details/17639191 ):

(1)region:可以简单理解为地理上的分区,比如亚洲地区,或者华北地区,再或者北京等等,没有具体大小的限制。根据项目具体的情况,可以自行合理划分region。

(2)zone:可以简单理解为region内的具体机房,比如说region划分为北京,然后北京有两个机房,就可以在此region之下划分出zone1,zone2两个zone。
我们可以简单地将region理解为Eureka集群,zone理解成机房,一个region由多个zone组成,而一个zone可以包含多个eureka server。

已一下图示例Eureka server配置为例
这里写图片描述
两台服务yaml配置示例:

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    prefer-same-zone-eureka: true
    #地区
    region: beijing
    availability-zones:
      beijing: zone-1,zone-2
    service-url:
      zone-1: http://localhost:9990/eureka/
      zone-2: http://localhost:8880/eureka/
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    prefer-same-zone-eureka: true
    #地区
    region: beijing
    availability-zones:
      beijing: zone-2,zone-1
    service-url:
      zone-1: http://localhost:9990/eureka/
      zone-2: http://localhost:8880/eureka/

service-url与serviceUrl写法是一样的因为yaml支持松散绑定

info

在控制台打开对应连接,你会发现404页面,完全不知道该服务具体信息,这是非常不友好的。不过打开的连接地址你会发现是/actuator/info ,看到这你一定会发现actuator监控。
有关SpringBoot actuator监控相关知识可参见
https://blog.csdn.net/it_faquir/article/details/80465725
info相关介绍

关于配置方面更详情可以直接查看源码

EurekaServer相关配置及默认值可查看EurekaServerConfigBean类

EurekaClient相关配置及默认值可查看EurekaClientConfigBean类

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值