微服务架构下的服务治理:在 SpringCloud 框架中实现服务的注册与发现
2023-02-26 12:28:31 时间
服务治理
- RPC远程过程调用协议的核心设计思想: 在于注册中心, 因为注册中心:管理每个服务与服务之间的一个依赖关系
- 服务治理: 在传统的RPC远程过程调用协议中,管理每个服务与服务之间的依赖关系非常复杂.可以使用服务治理技术,管理每个服务与服务之间的一个依赖关系.可以实现本地负载均衡,服务发现与注册,容错等
服务注册与发现
注册中心
-
在RPC远程过程调用协议中,有一个注册中心
-
SpringCloud支持三种组册中心:
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
- Consul(go语言)
- Eureka
- Zookeeper
-
Dubbo支持两种注册中心:
- Zookeeper
- Redis
-
- 注册中心概念: 存放服务地址相关信息(接口地址),通过别名注册获取
-
原理:
- 首先启动注册中心
- 服务提供者(Provider)服务在启动时,把当前服务信息以别名的方式注册到注册中心
- 服务消费者(Consumer)在调用接口的时候,使用服务别名从注册中心获取RPC远程调用地址
- 服务消费者(Consumer)获取RPC远程调用地址后,使用本地HttpClient技术实现调用
- 配置文件:
server.port=8761 # 服务端口号 eureka.instance.hostname=127.0.0.1 # 注册中心IP地址 eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/ # 注册url地址 eureka.client.register-with-eureka=false # 是否将自己注册到注册中心(集群时需要注册) eureka.client.fetch-registry=false # 是否需要到注册中心检索服务信息
- 注册中心项目:
[email protected]�务,开启注册中心
服务注册
- 将服务信息注册到注册中心上
- 配置文件:
server.port=8001 # 服务提供者(Provider)服务端口号 spring.application.name=Ticket-Service # 服务别名,注册到注册中心的名称:serviceId eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ # 服务提供者(Provider)注册到eureka注册中心的url地址 eureka.client.register-with-eureka=true # 是否将自己注册到注册中心 eureka.client.fetch-registry=true # 是否需要到注册中心检索服务信息
- 服务提供者(Provider)项目:
[email protected](Provider)服务注册到注册中心
服务发现
- 从注册中心获取服务信息
- 配置文件:
server.port=8200 # 服务消费者(Consumer)服务端口号 spring.application.name=Ticket-User # 服务别名,注册到注册中心的名称:serviceId eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ # 服务提供者(Provider)调用服务eureka注册中心的url地址 eureka.client.register-with-eureka=true # 是否将自己注册到注册中心 eureka.client.fetch-registry=true # 是否需要到注册中心检索服务信息
- 服务消费者(Consumer)项目:
1.在SpringCloud有两种方式调用服务:Rest Fegin(SpringCloud) Rest: - 使用RestTemplate,是SpringBoot的web组件,默认整合Ribbon负载均衡器.底层就是采用的HttpClient技术 - [email protected]�通信 - RestTemplate调用有两种方式:采用服务别名调用 直接url调用 restTemplate.getForObject("providerName(替代IP地址)/providerUrl",String.class) [email protected](@EnableDiscoveryClient)注解开启服务消费者(Consumer)从注册中心发现服务功能 3.使用Rest方式以别名方式调用需要依赖Ribbon负载均衡器,在RestTemplate方法上标注 @LoadBalanced,让RestTemplate在请求时拥有客户端的负载均衡的能力
-
Ribbon负载均衡:
-
在集群操作中:
- 首先启动注册中心
- 多个服务提供者(Provider)服务在启动时,把当前服务信息以别名的方式注册到注册中心
- 多个服务消费者(Consumer)在调用接口的时候,使用服务别名从注册中心获取RPC远程调用地址
- 服务消费者(Consumer)获取RPC远程调用地址后,先使用Ribbon负载均衡器实现负载均衡再使用本地HttpClient技术实现调用
- 负载均衡基本策略: 轮询机制(默认)
-
集群
- 微服务RPC远程过程调用协议的核心:服务治理:注册中心
- 搭建注册中心集群: 可以解决注册中心故障导致整个微服务环境不可用的问题
-
Eureka高可用原理:
- 默认情况下,Eureka是让服务注册的服务注册中心,不注册自己
- Eureka高可用就是将自己作为服务向其它注册中心注册自己, 形成一组相互注册的服务注册中心,实现服务清单的互相同步, 达到高可用效果
-
注册中心集群:
- 在注册服务过程中,只会保证有一台注册中心有对应的服务信息数据即可,只有注册中心宕机后,才启动同步数据到其它注册中心
- 配置文件:
server.port=9000 # 服务端口号 spring.application.name=euraka # 注册中心集群上服务器的名称要保持一致 eureka.instance.hostname=127.0.0.1 # 注册中心IP地址 eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:8761/eureka/ # ,注册到其它注册中心的url地址 eureka.client.register-with-eureka=true # 是否将自己注册到注册中心(集群时需要注册) eureka.client.fetch-registry=true # 是否需要到注册中心检索服务信息
Eureka自我保护机制
- Eureka自我保护机制: 为了防止EurekaClient可以正常运行时,与EurekaServer在网络无法通信的情况下,EurekaServer误将EurekaClient服务剔除
1.默认情况下,EurekaClient端定时向EurekaServer端发送心跳包 2.如果EurekaServer端在<一定时间>内没有收到EurekaClient端发送的心跳包,便会直接从服务注册列表中剔除该服务 3.在<短时间>内如果丢失了大量的服务实例心跳包,EurekaServer端会开启自我保护机制,不会剔除EurekaClient端
- 在本地开发环境中,测试时建议关闭EurekaServer端自我保护机制,保证不可用服务及时被剔除:
配置文件: EurekaServer端: eureka.server.enable-self-preservation=false # 是否开启自我保护机制(默认开启true) eureka.server.eviction-interval-timer-in-ms=2000 # 剔除间隔2秒 EurekaClient端-服务提供者(Provider): # 心跳检测和续约时间,在测试程序时,将值设置小些,保证服务关闭后,注册中心及时剔除服务 eureka.instance.lease-renewal-interval-in-seconds=1 # EurekaClient端向EurekaServer端发送心跳的时间间隔秒 eureka.instance.lease-expiration-duration-in-seconds=2 # EurekaServer端在收到最后一次心跳之后等待时间上限秒,超过就剔除服务
Zookeeper
- Eureka闭源,使用Zookeeper替代Eureka作为注册中心
- Zookeeper是分布式协调工具,可以实现注册中心的功能,采用Zookeeper的临时节点类型
- 临时节点和生命周期是相关联的,如果服务断开连接之后,临时节点就会被自动删除
配置文件: ZookeeperClient-服务提供者(Provider): server.port=8090 # 服务端口号 spring.application.name=zk-ticket # 服务别名,注册到注册中心的名称 spring.cloud.zookeeper.connect-string=127.0.0.1:2181 #注册到zookeeper注册中心的url地址 ZookeeperClient-服务消费者(Consumer): server.port=8020 # 服务端口号 spring.application.name=zk-user # 服务别名,注册到注册中心的名称 spring.cloud.zookeeper.connect-string=127.0.0.1:2181 #调用服务的zookeeper注册中心的url地址 1.ZookeeperClient-服务提供者(Provider)[email protected]��服务 2.ZookeeperClient-服务消费者(Consumer)[email protected]��服务 3..[email protected]��均衡功能进行服务的调用
Consul
- Consul是开源的分布式服务发现与配置管理系统,由HashiCorp公司用Go语言开发
-
特点:
- 基于raft协议,比较简洁
- 支持健康检查
- 支持Http和DNS协议
- 支持跨数据中心的WAN集群
- 提供图形界面
- 跨平台
-
Consul环境搭建:
- 下载Consul
- 设置环境变量:添加Consul所在目录
- cmd启动:consul agent -dev -ui -node=cy(-dev:开发服务器模式启动 -node:节点名 -ui界面访问支持,默认开启)
- 访问Consul: http://localhost:8500
配置文件: ConsulClient-服务提供者(Provider): server.port=8780 # 服务端口号 spring.application.name=consul-ticket # 服务别名,注册到注册中心的名称 spring.cloud.consul.host=127.0.0.1 # Consul服务url地址 spring.cloud.consul.port=8500 # Consul服务端口号 spring.cloud.consul.discovery.hostname=192.168.66.128 # 服务在注册中心显示的IP地址(默认情况下,服务注册到注册中心,地址随机生成) ConsulClient-服务消费者(Consumer): server.port=8099 # 服务端口号 spring.application.name=consul-user # 服务别名,注册到注册中心的名称 spring.cloud.zookeeper.connect-string=127.0.0.1:2181 #服务调用服务Consul注册中心的url地址 1.ZookeeperClient-服务提供者(Provider)[email protected]��服务 2.ZookeeperClient-服务消费者(Consumer)[email protected]��服务 3..[email protected]��均衡功能进行服务的调用
DiscoveryClient
- 获取注册中心的服务信息
- 用于实现本地负载均衡
@Autowired // 自动装配 private DiscoveryClient discoveryClient; // Discovery接口,用于获取注册中心的服务信息 @RequestMapping("/discoveryClientMember") public List<ServiceInstance> discoveryClientMember(){ List<ServiceInstance> instances=discoveryClient.getInstance("consul-ticket"); for(ServiceInstance serviceInstance:instances){ System.out.println("URI:"+serviceInstance.getUri()); } return instance; }
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- Jgit的使用笔记
- 利用Github Action实现Tornadofx/JavaFx打包
- 叹息!GitHub Trending 即将成为历史!
- 微软软了?开源社区讨论炸锅,GitHub CEO 亲自来答
- GitHub Trending 列表频现重复项,前后端都没去重?
- Photoshop Elements 2021版本软件安装教程(mac+windows全版本都有)
- (ps全版本)Photoshop 2020的安装与破解教程(mac+windows全版本都有)
- (ps全版本)Photoshop cc2018的安装与破解教程(mac+windows全版本,包括2023
- 环境搭建:Oracle GoldenGate 大数据迁移到 Redshift/Flat file/Flume/Kafka测试流程
- 每个开发人员都要掌握的:最小 Linux 基础课
- 来撸羊毛了!Windows 环境下 Hexo 博客搭建,并部署到 GitHub Pages
- 超实用!手把手入门 MongoDB:这些坑点请一定远离
- 【GitHub日报】22-10-09 zustand、neovim、webtorrent、express 等4款App今日上新
- 【GitHub日报】22-10-10 brew、minio、vite、seaweedfs、dbeaver 等8款App今日上新
- 【GitHub日报】22-10-11 cobra、grafana、vue、ToolJet、redwood 等13款App今日上新
- Photoshop 2018 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2017 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2020 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2023 资源免费下载(mac+windows全版本都有,包括最新的2023)
- 最新版本Photoshop CC2018软件安装教程(mac+windows全版本都有,包括2023