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

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

​​

一、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/显示

四、向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、然后启动程序访问服务消费者可以看到效果

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

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

Spring Cloud第二篇 | 使用并认识Eureka注册中心的更多相关文章

  1. Spring Cloud第三篇 | 搭建高可用Eureka注册中心

    ​ ​本文是Spring Cloud专栏的第三篇文章,了解前两篇文章内容有助于更好的理解后面文章: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring ...

  2. spring cloud(学习笔记)高可用注册中心(Eureka)的实现(二)

    绪论 前几天我用一种方式实现了spring cloud的高可用,达到两个注册中心,详情见spring cloud(学习笔记)高可用注册中心(Eureka)的实现(一),今天我意外发现,注册中心可以无限 ...

  3. Spring Cloud系列(一):服务注册中心

    一.Spring Cloud简介 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线).分布式系统的协调导致了样 ...

  4. spring cloud(学习笔记)高可用注册中心(Eureka)的实现(一)

    最近在学习的时候,发现微服务架构中,假如只有一个注册中心,那这个注册中心挂了可怎么办,这样的系统,既不安全,稳定性也不好,网上和书上找了一会,发现这个spring cloud早就想到了,并帮我们解决了 ...

  5. Spring Cloud第九篇 | 分布式服务跟踪Sleuth

    ​ ​本文是Spring Cloud专栏的第九篇文章,了解前八篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...

  6. 一起来学Spring Cloud | 第二章:服务注册和发现组件 (Eureka)

    本篇文章,很浅显的一步步讲解如何搭建一个能运行的springcloud项目(带所有操作截图).相信!看完本篇之后,你会觉得springcloud搭建如此简单~~~~ 一. Eureka简介: 1.1  ...

  7. 14 微服务电商【黑马乐优商城】:day02-springcloud(搭建Eureka注册中心)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...

  8. spring cloud 专题一 (spring cloud 入门搭建 之 Eureka注册中心搭建)

    一.前言 本文为spring cloud 微服务框架专题的第一篇,主要讲解如何快速搭建spring cloud微服务及Eureka 注册中心 以及常用开发方式等. 本文理论不多,主要是傻瓜式的环境搭建 ...

  9. Spring Cloud:多环境配置、eureka 安全认证、容器宿主机IP注册

    记录一下搭建 Spring Cloud 过程中踩过的一些坑,测试的东西断断续续已经弄了好多了,一直没有时间整理搭建过程,时间啊~时间~ Spring 版本 Spring Boot:2.0.6.RELE ...

随机推荐

  1. TypeError: expected string or bytes-like object

    在写Python代码的时候,遇到了"TypeError: a bytes-like object is required, not 'str'"错误,此处实验机器的Python环境 ...

  2. __new__与__init__的区别和应用场景

    创建实例的时候, 先运行的_new_方法, _new_创建对象 Student object(实例)返回给 _init_ 里面的第一个参数self class Student(object): def ...

  3. [考试反思]0909csp-s模拟测试41:反典

    说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...

  4. CSPS模拟 63

    每天都考试都快傻了O_o $T1 Median$ 一看就不能从通项上下手.. 那么就是..给你一个序列..区间中位数.. 对顶堆! 爆调2h,心态炸裂. 据说根据鬼畜的函数定义和$mod<=le ...

  5. 关于GC(上):Apache的POI组件导致线上频繁FullGC问题排查及处理全过程

    某线上应用在进行查询结果导出Excel时,大概率出现持续的FullGC.解决这个问题时,记录了一下整个的流程,也可以作为一般性的FullGC问题排查指导. 1. 生成dump文件 为了定位FullGC ...

  6. python学习之【第十七篇】:Python中的面向对象(类和对象)

    1.什么是类和类的对象? 类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起,类是现实世界的抽象的实体以编程形式出现.实例是这些对象的具体化.类是用来描述一类事物,类的对象指的 ...

  7. CDQ分治(学习笔记)

    离线算法——CDQ分治 CDQ (SHY)显然是一个人的名字,陈丹琪(MM)(NOI2008金牌女选手). 从归并开始(这里并没有从逆序对开始,是想直接引入分治思想,而不是引入处理对象) 一个很简单的 ...

  8. 0911作业-if while循环小练习

    输入姑娘的年龄后,进行以下判断: 如果姑娘小于18岁,打印"不接受未成年" 如果姑娘大于18岁小于25岁,打印"心动表白" 如果姑娘大于25岁小于45岁,打印& ...

  9. php windows与linux下的路径区别

    php windows与linux下的路径区别windows用的是"\",linux用的是"/"这一点要特别清楚,, ps:在PHP windows也可以用/表 ...

  10. element 动态合并表格

    前言 element 官方的例子太简单了,不满足实际的需求 数据肯定是动态的,合并的行数,列数都是动态的,该如何知道每一行的合并数呢 需求 动态合并表格,数据来源于数据库 正文 一开始,我的数据源是单 ...