30

Spring Cloud第二篇 | 使用并认识Eureka注册中心

 4 years ago
source link: http://www.cnblogs.com/coding-farmer/p/11996199.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

EJJFB37.jpg!web

本文是Spring Cloud专栏的 第二篇 文章,了解 前一篇 文章内容有助于更好的理解本文:

  1. Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览

uA73Unq.jpg!web ​​

一、SpringCloud快速开发入门

SpringCloud是构建在SpringBoot基础之上的

1、创键一个服务提供者(springcloud-service-provider)

1-1、创键提供者类

@RestController
@RequestMapping("/provider")
public class ProviderController {
    @RequestMapping("/hello")
    public String hello(){
        return "spring cloud provider-01 hello world";
    }
}

1-2、配置服务提供者的application.yml文件

spring:
  application:
    name: springcloud-service-provider
server:
  port: 8080

2、创键一个服务消费者(springcloud-service-consumer)

2-1、配置RestTemplate类

@Configuration
public class BeanConfig {
    /**
     * RestTemplate 该类是spring官方提供的,不是真正的spring cloud调用
     */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

2-2、然后创键消费者类

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
​
    @Autowired
    private RestTemplate restTemplate;
​
    @RequestMapping("/hello")
    public String hello(){
        //逻辑判断省略
​
        //调用spring cloud服务提供者提供的服务                                        调用远程服务的返回值类型
        return  restTemplate.getForEntity("http://localhost:8080/provider/hello",String.class).getBody();
    }
}

2-3、配置服务消费的application.yml文件

spring:
  application:
    name: springcloud-service-consumer
server:
  port: 9090

分别启动springcloud-service-provider,springcloud-service-consumer,访问消费者接口,可以看到效果。

二、使用SpringCloud注册中心Eureka

在微服务架构中,服务注册与发现是核心组件之一,手动指定每个服务是很低效的, Spring cloud提供了多种服务注册与发现的实现方式,例如: Eureka、Consu、 Zookeeper

SringCloud支持得最好的是 Eureka,其次是 Consul,再次是 Zookeeper。

1、什么是服务治理

在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。

2、服务注册与发现

在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。

另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,让后在实现本地rpc调用远程。

3、Eureka是什么

Eureka是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心。

Eureka是一个基于REST的服务,用来定位服务,进行中间层服务器的负载均衡和故障转移

Eureka是 Netflix公司开发的, Spring Cloud封装了Neix公司开发的Eureka模块来实现服务注册和发现也就是说 Spring Cloud对Netflix eureka做了二次封装

Eureka采用了C-S(客户端/服务端)的设计架构,也就是Eureka由两个组件组成:Eureka服务端 和 Eureka客户端。Eureka server作为服务注册的服务端,它是服务注册中心,而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka server服务端,并维持心跳连接, Eureka客户端是一个Java客户端,用来简化与服务器的交互、负载均衡,服务的故障切换等。

有了 Eureka注册中心,系统的维护人员就可以通过 Eureka server来监控系统中各个微服务是否正常运行。

4、Eureka和Zookeeper对比

著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)

由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡,在此 Zookeeper保证的是CP而 Eureka则是AP

  • Consistency(一致性), 数据一致更新,所有数据变动都是同步的

  • Availability(可用性), 好的响应性能

  • Partition tolerance(分区容忍性) 可靠性

1、“C”是指一致性,即当一个Process(过程)修改了某个数据后,其他Process读取这是数据是,得到的是更新后的数据,但并不是所有系统都 可以做到这一点。例如,在一些并非严格要求一致性的系统中,后来的Process得到的数据可能还是修改之前的数据,或者需要等待一定时间后才能得到修改 之后的数据,这被成为“弱一致性”,最经典的应用就是DNS系统。当用户修改了DNS配置后,往往不会马上在全网更新,必定会有一个延迟,这个延迟被称为 “不一致窗口”,它的长度取决于系统的负载、冗余的个数等因素。但对于某些系统而言,一旦写入,后面读取的一定是修改后的数据,如银行账户信息,这被称为 “强一致性”。

2、“A”是指可用性。即系统总是能够为用户提供连续的服务能力。当用户发出请求是,系统能给出响应(成功或者失败),而且是立即给出响应,而不是等待其他事情完成才响应。如果需要等待某件事情完成才响应,那么“可用性”就不存在了。

3、“P”是指容错性。任何一个分布式计算系统都是由多个节点组成的。在正常情况下,节点与节点之间的通信是正常的。但是在某些情况下,节点之间的通信会 断开,这种断开成为“Partition”。在分布式计算的实现中,Partition是很常见的,因为节点不可能永远不出故障,尤其是对于跨物理地区的 海量存储系统而言,而容错性则可以保证如果只是系统中的部分节点不可用,那么相关的操作仍旧能够正常完成。

4-1、Zookeeper保证CP

在 ZooKeeper中,当 master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行 leader选举,但是问题在于,选举 leader需要一定时间,且选举期间整个 ZooKeeper集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得 ZooKeeper集群失去 master节点是大概率事件,虽然服务最终能够恢复,但是在选举时间内导致服务注册长期不可用是难以容忍的。

4-2、Eureka保证AP

Eureka优先保证可用性, Eureka各个节点是平等的,某几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而 Eureka的客户端在向某个 Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台 Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)

所以 Eureka在网络故障导致部分节点失去联系的情况下,只要有一个节点可用,那么注册和查询服务就可以正常使用,而不会像 zookeeper那样使整个注册服务瘫痪, Eureka优先保证了可用性。

三、搭建与配置 Eureka服务注册中心

SpringCloud要使用 Eureka注册中心非常简单和方便, SpringCloud中的Eureka服务注册中心实际上也是一个SpringBoot工程,我们只需通过引入相关依赖和注解配置就能让 SpringBoot构建的微服务应用轻松地与Eureka进行整合,他不像Zookeeper那样需要安装独立的Zookeeper服务。

1、SpringCloud专栏案例采用多模块化管理,在父模块(spirngcloud-learn)中添加SpringCloud管理依赖

 <!--使用spring cloud要添加依赖管理-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2、创键Eureka服务端模块(springcloud-eureka-server)

2-1、添加Eureka服务端依赖

<!--eureka服务端依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2-2、配置application.yml

spring:
  application:
    name: springcloud-eureka-server
server:
  port: 8700
#设置该服务中心的hostname,指定ip,该实例名称不能重复
eureka:
  instance:
    hostname: localhost
  client:
    #由于我们目前创建的应用是一个服务注册中心,而不是一个普通的应用,默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种自己向自己注册的默认行为
    register-with-eureka: false
    #表示是否从Eureka Server获取注册信息,默认为true。如果这是一个单点的 Eureka Server,不需要同步其他节点的数据,可以设为false。
    fetch-registry: false
    #指定服务注册中心的位置
    #如果是集群,Eureka集群相互指向注册中心
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
  server:
    #自我保护模式默认是自动开启的,可以选择关闭,禁用自我保护模式,保证不可用的服务及时剔除
    enable-self-preservation: true
    #剔除失效服务间隔单位ms,默认1分钟
    eviction-interval-timer-in-ms: 20000
    #留存的服务示例低于多少比例进入保护模式,默认85%
    renewal-percent-threshold: 0.5

2-3、在启动类上添加@EnableEurekaServer注解

2-4、启动Eureka服务端,访问http://localhost:8700/显示

mmUVneE.jpg!web

四、向Eureka服务注册中心注册服务

上面已经配置好了一个Eureka服务注册中心,接下来改造springcloud-service-provider,springcloud-service-consumer模块

1、修改服务提供者(springcloud-service-provider)

1-1、在服务提供者加入Eureka客户端依赖

<!--spring cloud集成eureka客户端的起步依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

1-2、在主类上添加@EnableEurekaClient注解

1-3、修改服务提供者的application.yml配置添加Eureka注册中心地址

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8700/eureka

1-4、启动服务提供者,就可以在Eureka的web端页面看到服务注册上去了

2、修改服务消费者(springcloud-service-consumer)

我们已经搭建一个服务注册中心,同时也向这个服务注册中心注册了服务,接下来我们就可以发现和消费服务了,这其中服务的发现由 eureka客户端实现,而服务的消费由 Ribbon实现也就是说服务的调用需要 eureka客户端和 Ribbon两者配合起来才能实现。

Eureka客户端是什么

Eureka客户端是一个Java客户端,用来连接 Eureka服务端,与服务端进行交互、负载均衡,服务的故障切换等

Ribbon是什么

Ribbon是一个基于HTTP和TCP的客户端负载均衡器,当使用Ribbon对服务进行访问的时候,它会扩展 Eureka客户端的服务发现功能,实现从 Eureka注册中心中获取服务端列表,并通过Eureka客户端来确定服务端是否己经启动。

Ribbon在Eureka客户端服务发现的基础上,实现了对服务实例的选择策略从而实现对服务的负载均衡消费。

接下来我们来让服务消费者去消费服务:我们前面搭建了服务消费者项目,修改服务消费者(springcloud-service-consumer)

2-1、添加依赖、添加注解、修改配置和四栏目中的1-1,1-2、1-3步骤一样,此处省略

2-2、前面我介绍了服务的发现由 eureka客户端实现而服务的真正调用由Ribbon实现,所以我们需要在调用服务提供者时使用 Ribbon来调用

   @LoadBalanced //加入ribbon的支持,那么在调用时,即可改为使用服务名称来访问
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

加入ribbon的支持,那么在调用时,即可改为使用服务名称来访问,将ip:port改为服务名称调用就行了

restTemplate.getForEntity("http://SPRINGCLOUD-SERVICE-PROVIDER/service/hello",String.class).getBody();

2-3、然后启动程序访问服务消费者可以看到效果

faa6Vvy.jpg!web

2-4、访问http://localhost:8700/可以看到Eureka的web控制台上注册了消费者和服务者

YjM77vi.jpg!web

详细参考案例源码: https://gitee.com/coding-farmer/spirngcloud-learn

ryeYfee.jpg!web

aUruIbE.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK