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

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

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

​​

1、SpringCloud快速开发入门

SpringCloud是构建在SpringBoot基础之上的spring

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

1-一、创键提供者类服务器

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

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

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

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

2-一、配置RestTemplate类架构

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

2-二、而后创键消费者类app

@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-三、配置服务消费的application.yml文件负载均衡

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

分别启动springcloud-service-provider,springcloud-service-consumer,访问消费者接口,能够看到效果。分布式

2、使用SpringCloud注册中心Eureka

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

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

一、什么是服务治理

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

二、服务注册与发现

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

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

三、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来监控系统中各个微服务是否正常运行。

四、Eureka和Zookeeper对比

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

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

  • Consistency(一致性), 数据一致更新,全部数据变更都是同步的

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

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

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

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

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

4-一、Zookeeper保证CP

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

4-二、Eureka保证AP

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

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

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

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

一、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>

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

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

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

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-三、在启动类上添加@EnableEurekaServer注解

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

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

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

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

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

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

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

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

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

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

二、修改服务消费者(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-3步骤同样,此处省略

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-三、而后启动程序访问服务消费者能够看到效果

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

 

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

相关文章
相关标签/搜索