SpringCloud微服务中Eureka集群与服务提供者集群的实现(图文详解+简单易懂)
一。为什么需要集群?
1.单体服务注册与发现
在SpringCloud单体微服务实现中,我们知道是由一个Eureka当做服务发现与注册中心,再有一个服务提供者注册服务,然后服务消费者去发现并调用该服务。如下图所示:
2.Eureka集群
上面的模型虽然能够完成服务的调用过程,但是却是有一个致命的缺陷,当Eureka突然挂了,整个服务调用就瘫痪了,系统会完全死机,这个是相当恐怖的。所以在上面的基础上,我们进行了优化,给Eureka做一个集群,当一台Eureka挂了的时候,另外几台Eureka依然能够正常的运行,很好的做了一个预防措施。如下图所示:
3.服务提供者集群
经过上面的优化之后,该模型能够在防止在注册中心宕机后,服务还能保持联通状态。但是在实际项目环境中,往往我们服务调用会有很高的并发量,比如淘宝双十一的时候,并发量那是以亿为单位计算的,如果服务提供者只有单个而不做集群的话,那服务提供端肯定会崩掉的,所以为了提高系统并发量以及性能,我们一般都会在Eureka做集群的基础上,再在服务提供端上也做成集群处理。如下图所示:
最终一个服务调用模型优化至此,泛化来说,一个SpringCloud微服务系统中,就是根据许许多多这样的模块所构成的。
二。示例项目构成
-
springcloud_demo
:项目名称 -
eureka-server-7001
:7001端口启动的eureka -
eureka-server-7002
:7002端口启动的eureka -
eureka-server-7003
:7003端口启动的eureka -
provider-8001
:8001端口启动的服务提供者 -
provider-8002
:8002端口启动的服务提供者 -
provider-8003
:8003端口启动的服务提供者 -
consumer
:服务消费者
说明:本篇博客主要讲集群实现过程,没有说明详细项目创建步骤,如果对SpringCloud项目构建有疑问的小伙伴,请参照我的另外一篇博客:使用Idea构建SpringCloud项目
三。Eureka集群的实现
1.创建eureka-server
本篇博客以三个eureka作为集群,首先先创建三个eureka-server:
2.Eureka集群结构图
所谓Eureka集群,就是八个字,互相注册,相互守望。例如我创建的三个eureka-server,7001端口的需要往7002、7003端口的eureka-server上注册,7002端口的需要往7001、7003端口的eureka-server上注册,7003端口的需要往7001、7002端口的eureka-server上注册,结构图如下图所示:
3.配置本地映射
1.因为我这是本机在跑,为了区别三个eureka-server实例,避免三个都是localhost访问,需要在本地做一个映射。找到hosts文件:
2.修改hosts文件,可能会报不能修改的错误,先将其复制到桌面,修改后再粘贴回原来的文件夹即可:
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
注解,声明它是一个注册中心:
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.依次启动
8.访问网址
1.访问http://eureka-server-7001.com:7001/
2.访问http://eureka-server-7002.com:7002/
3.访问http://eureka-server-7003.com:7003/
4.如果你打开三台的Eureka注册中心,能出现和上面一样的结果,那么Eureka集群就已经搭建成功!
四。服务提供集群
1.创建三个provider
本篇博客以三个provider作为集群,首先先创建三个provider:
2.服务提供集群结构图
服务提供者集群其实是由多个不同端口但提供相同服务的子模块,使用相同的服务名注册到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
注解,声明这是一个客户端:
4.创建完成后,provider-8001文件结构如下图所示:
4.构建provider-8002
1.provider-8002操作步骤与provider-8001一致,不过在控制类中修改了为8002端口:
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端口:
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.依次启动
7.查看Eureka注册中心
8.访问网址
1.访问http://eureka-server-7001.com:8001/provider/getInfo
2.访问http://eureka-server-7001.com:8002/provider/getInfo
3.访问http://eureka-server-7001.com:8003/provider/getInfo
4.如果访问以上网址显示和对应图片一致,则说明服务提供集群搭建已经成功!
五。服务消费端
1.创建一个consumer
2.服务调用结构图
首先服务的消费端是发送请求给Eureka,然后由Eureka去找到所有已注册的服务,看服务提供方是否在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容器中:
4.启动服务
5.查看Eureka注册中心
6.访问网址
1.访问http://eureka-server-7001.com:8777/consumer/getInfo,初始显示8001端口提供服务
2.刷新一次,显示变化,端口变成8002:
3.再刷新一次,显示变化,端口变成8003:
为什么会变成这样呢?
原因是当我们做了服务提供集群时,用的是@FeignClient
的方式调用其他模块的服务,@FeignClient
实现了负载均衡,默认方式是轮询方式,依次访问集群中的服务。在本博客中的体现就是如果你不断刷新,会一直以8001,8002,8003的方式轮询下去。
六。模拟宕机
由于图片叙述太多,这里就不做太多赘述,只列举了几个简单的宕机例子:
- eureka-server-7001与eureka-server-7002同时宕机,eureka-server-7003正常,服务调用成功。
- provider-8001宕机,刷新轮询只在8002端口与8003端口之间。
- provider-8001与provider-8002同时宕机,刷新不轮询,一直为8003端口。
该demo已上传,感兴趣的小伙伴自行下载进行模拟宕机操作:springcloud_demo
本文地址:https://blog.csdn.net/weixin_44009447/article/details/108856122