欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

程序员文章站 2022-06-24 22:45:57
文章目录一。为什么需要集群?1.单体服务注册与发现2.Eureka集群3.服务提供者集群二。示例项目构成三。Eureka集群的实现1.创建eureka-server2.Eureka集群结构图3.配置本地映射4.构建eureka-server-70015.构建eureka-server-70026.构建eureka-server-70037.依次启动8.访问网址四。服务提供集群1.创建三个provider2.服务提供集群结构图3.构建provider-80014.构建provider-80025.构建prov...


一。为什么需要集群?

1.单体服务注册与发现

在SpringCloud单体微服务实现中,我们知道是由一个Eureka当做服务发现与注册中心,再有一个服务提供者注册服务,然后服务消费者去发现并调用该服务。如下图所示:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

2.Eureka集群

上面的模型虽然能够完成服务的调用过程,但是却是有一个致命的缺陷,当Eureka突然挂了,整个服务调用就瘫痪了,系统会完全死机,这个是相当恐怖的。所以在上面的基础上,我们进行了优化,给Eureka做一个集群,当一台Eureka挂了的时候,另外几台Eureka依然能够正常的运行,很好的做了一个预防措施。如下图所示:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

3.服务提供者集群

经过上面的优化之后,该模型能够在防止在注册中心宕机后,服务还能保持联通状态。但是在实际项目环境中,往往我们服务调用会有很高的并发量,比如淘宝双十一的时候,并发量那是以亿为单位计算的,如果服务提供者只有单个而不做集群的话,那服务提供端肯定会崩掉的,所以为了提高系统并发量以及性能,我们一般都会在Eureka做集群的基础上,再在服务提供端上也做成集群处理。如下图所示:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
最终一个服务调用模型优化至此,泛化来说,一个SpringCloud微服务系统中,就是根据许许多多这样的模块所构成的。

二。示例项目构成

  1. springcloud_demo:项目名称
  2. eureka-server-7001:7001端口启动的eureka
  3. eureka-server-7002:7002端口启动的eureka
  4. eureka-server-7003:7003端口启动的eureka
  5. provider-8001:8001端口启动的服务提供者
  6. provider-8002:8002端口启动的服务提供者
  7. provider-8003:8003端口启动的服务提供者
  8. consumer:服务消费者

说明:本篇博客主要讲集群实现过程,没有说明详细项目创建步骤,如果对SpringCloud项目构建有疑问的小伙伴,请参照我的另外一篇博客:使用Idea构建SpringCloud项目

三。Eureka集群的实现

1.创建eureka-server

本篇博客以三个eureka作为集群,首先先创建三个eureka-server

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

2.Eureka集群结构图

所谓Eureka集群,就是八个字,互相注册,相互守望。例如我创建的三个eureka-server,7001端口的需要往7002、7003端口的eureka-server上注册,7002端口的需要往7001、7003端口的eureka-server上注册,7003端口的需要往7001、7002端口的eureka-server上注册,结构图如下图所示:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

3.配置本地映射

1.因为我这是本机在跑,为了区别三个eureka-server实例,避免三个都是localhost访问,需要在本地做一个映射。找到hosts文件:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

2.修改hosts文件,可能会报不能修改的错误,先将其复制到桌面,修改后再粘贴回原来的文件夹即可:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

4.构建eureka-server-7001

1.在application.yml文件中添加以下代码:

server:
  #运行端口
  port: 7001
eureka:
  instance:
    #注册ip
    hostname: eureka-server-7001.com
  client:
    #禁止自己当做服务注册
    register-with-eureka: false
    #屏蔽注册信息,单点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: false
    #注册url
    serviceUrl:
      defaultZone: http://eureka-server-7002.com:7002/eureka/,http://eureka-server-7003.com:7003/eureka/

2.在启动类上加上@EnableEurekaServer注解,声明它是一个注册中心:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

5.构建eureka-server-7002

eureka-server-7002构建步骤与eureka-server-7001一致,只是application.yml文件内容不同:

server:
  #运行端口
  port: 7002
eureka:
  instance:
    #注册ip
    hostname: eureka-server-7002.com
  client:
    #禁止自己当做服务注册
    register-with-eureka: false
    #屏蔽注册信息,单点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: false
    #注册url
    serviceUrl:
      defaultZone: http://eureka-server-7001.com:7001/eureka/,http://eureka-server-7003.com:7003/eureka/

6.构建eureka-server-7003

eureka-server-7003构建步骤与eureka-server-7001一致,只是application.yml文件内容不同:

server:
  #运行端口
  port: 7003
eureka:
  instance:
    #注册ip
    hostname: eureka-server-7003.com
  client:
    #禁止自己当做服务注册
    register-with-eureka: false
    #屏蔽注册信息,单点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: false
    #注册url
    serviceUrl:
      defaultZone: http://eureka-server-7001.com:7001/eureka/,http://eureka-server-7002.com:7002/eureka/

7.依次启动

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

8.访问网址

1.访问http://eureka-server-7001.com:7001/

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
2.访问http://eureka-server-7002.com:7002/

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
3.访问http://eureka-server-7003.com:7003/

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
4.如果你打开三台的Eureka注册中心,能出现和上面一样的结果,那么Eureka集群就已经搭建成功!

四。服务提供集群

1.创建三个provider

本篇博客以三个provider作为集群,首先先创建三个provider

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

2.服务提供集群结构图

服务提供者集群其实是由多个不同端口但提供相同服务的子模块,使用相同的服务名注册到Eureka注册中心上,提高了系统的并发访问量,提升了性能。结构图如下图所示:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

3.构建provider-8001

1.我们分别在provider-8001, provider-8002, provider-8003添加示例业务代码,首先是provider-8001,在主目录下新建一个controller包,在该包中新建一个控制类ProviderController,该控制类代码如下:

/**
 * @Description:提供者控制类
 * @Author :zks
 * @Date :11:15 2020/9/28
 */
@RestController
@RequestMapping("provider")
public class ProviderController {

    @GetMapping("getInfo")
    public String getInfo(){
        return "这是8001端口在提供服务";
    }

}

2.application.yml文件内容如下:

eureka:
  client:
    serviceUrl:
      #服务注册地址
      defaultZone: http://eureka-server-7001.com:7001/eureka/,http://eureka-server-7002.com:7002/eureka/,http://eureka-server-7003.com:7003/eureka/
  instance:
    #服务实例名称
    instance-id: 8001
    #是否暴露服务ip地址
    prefer-ip-address: true
server:
  #运行端口
  port: 8001
spring:
  application:
    #服务注册名称
    name: service-provider

3.最后别忘了在启动类中加上@EnableEurekaClient注解,声明这是一个客户端:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
4.创建完成后,provider-8001文件结构如下图所示:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

4.构建provider-8002

1.provider-8002操作步骤与provider-8001一致,不过在控制类中修改了为8002端口:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
2.application.yml文件内容如下:

eureka:
  client:
    serviceUrl:
      #服务注册地址
      defaultZone: http://eureka-server-7001.com:7001/eureka/,http://eureka-server-7002.com:7002/eureka/,http://eureka-server-7003.com:7003/eureka/
  instance:
    #服务实例名称
    instance-id: 8002
    #是否暴露服务ip地址
    prefer-ip-address: true
server:
  #运行端口
  port: 8002
spring:
  application:
    #服务注册名称
    name: service-provider

5.构建provider-8003

1.provider-8003操作步骤与provider-8001一致,不过在控制类中修改了为8003端口:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
2.application.yml文件内容如下:

eureka:
  client:
    serviceUrl:
      #服务注册地址
      defaultZone: http://eureka-server-7001.com:7001/eureka/,http://eureka-server-7002.com:7002/eureka/,http://eureka-server-7003.com:7003/eureka/
  instance:
    #服务实例名称
    instance-id: 8003
    #是否暴露服务ip地址
    prefer-ip-address: true
server:
  #运行端口
  port: 8003
spring:
  application:
    #服务注册名称
    name: service-provider

6.依次启动

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

7.查看Eureka注册中心

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

8.访问网址

1.访问http://eureka-server-7001.com:8001/provider/getInfo

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
2.访问http://eureka-server-7001.com:8002/provider/getInfo

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

3.访问http://eureka-server-7001.com:8003/provider/getInfo

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
4.如果访问以上网址显示和对应图片一致,则说明服务提供集群搭建已经成功!

五。服务消费端

1.创建一个consumer

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

2.服务调用结构图

首先服务的消费端是发送请求给Eureka,然后由Eureka去找到所有已注册的服务,看服务提供方是否在Eureka上注册成功,如果注册成功则发送请求去调用服务提供方。
SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

3.构建consumer

1.在根目录下新建一个client包,在该包中新建一个跨模块服务调用类ProviderClient

/**
 * @Description:使用@FeignClient注解调用注册子模块接口方法
 * @Author :zks
 * @Date :16:31 2020/8/27
 */
//注册子模块名称
@FeignClient(value = "service-provider")
public interface ProviderClient {


    /**
     * 跨模块调用得到用户信息列表
     * @return
     */
    @GetMapping("provider/getInfo")
    public String getInfo();

}

2.然后在根目录下新建一个controller包,在该包中新建一个消费端控制器ConsumerController

/**
 * @Description:消费端控制器
 * @Author :zks
 * @Date :16:18 2020/8/27
 */
@RequestMapping("consumer")
@RestController
public class ConsumerController {

    @Autowired
    private ProviderClient providerClient;

    @RequestMapping("getInfo")
    public String getInfo(){
        return providerClient.getInfo();
    }
}

3.application.yml文件内容如下:

eureka:
  client:
    serviceUrl:
      #服务注册地址
      defaultZone: http://eureka-server-7001.com:7001/eureka/,http://eureka-server-7002.com:7002/eureka/,http://eureka-server-7003.com:7003/eureka/
  instance:
    #服务实例名称
    instance-id: 8777
    #是否暴露服务ip地址
    prefer-ip-address: true

server:
  #运行端口
  port: 8777
spring:
  application:
    #服务注册名称
    name: service-consumer

4.最后在启动类中加入@EnableEurekaClient注册服务,以及加入@EnableFeignClients将调用注册子模块接口引入到Spring容器中:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

4.启动服务

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

5.查看Eureka注册中心

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)

6.访问网址

1.访问http://eureka-server-7001.com:8777/consumer/getInfo,初始显示8001端口提供服务

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
2.刷新一次,显示变化,端口变成8002:

SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
3.再刷新一次,显示变化,端口变成8003:
SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
为什么会变成这样呢?

原因是当我们做了服务提供集群时,用的是@FeignClient的方式调用其他模块的服务,@FeignClient实现了负载均衡,默认方式是轮询方式,依次访问集群中的服务。在本博客中的体现就是如果你不断刷新,会一直以8001,8002,8003的方式轮询下去。

六。模拟宕机

由于图片叙述太多,这里就不做太多赘述,只列举了几个简单的宕机例子:

  1. eureka-server-7001与eureka-server-7002同时宕机,eureka-server-7003正常,服务调用成功。
  2. provider-8001宕机,刷新轮询只在8002端口与8003端口之间。
  3. provider-8001与provider-8002同时宕机,刷新不轮询,一直为8003端口。

该demo已上传,感兴趣的小伙伴自行下载进行模拟宕机操作:springcloud_demo

本文地址:https://blog.csdn.net/weixin_44009447/article/details/108856122