首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微服务架构下的服务治理:在 SpringCloud 框架中实现服务的注册与发现

微服务架构下的服务治理:在 SpringCloud 框架中实现服务的注册与发现

原创
作者头像
攻城狮Chova
修改于 2021-08-18 02:31:40
修改于 2021-08-18 02:31:40
8660
举报
文章被收录于专栏:攻城狮Chovas攻城狮Chovas

服务治理

  • RPC远程过程调用协议的核心设计思想: 在于注册中心, 因为注册中心:管理每个服务与服务之间的一个依赖关系
  • 服务治理: 在传统的RPC远程过程调用协议中,管理每个服务与服务之间的依赖关系非常复杂.可以使用服务治理技术,管理每个服务与服务之间的一个依赖关系.可以实现本地负载均衡,服务发现与注册,容错等

服务注册与发现

注册中心

  • 在RPC远程过程调用协议中,有一个注册中心
    • SpringCloud支持三种组册中心:
      • Consul(go语言)
      • Eureka
      • Zookeeper
    • Dubbo支持两种注册中心:
      • Zookeeper
      • Redis
  • 注册中心概念: 存放服务地址相关信息(接口地址),通过别名注册获取
  • 原理:
    • 首先启动注册中心
    • 服务提供者(Provider)服务在启动时,把当前服务信息以别名的方式注册到注册中心
    • 服务消费者(Consumer)在调用接口的时候,使用服务别名从注册中心获取RPC远程调用地址
    • 服务消费者(Consumer)获取RPC远程调用地址后,使用本地HttpClient技术实现调用
  • 配置文件:
代码语言:txt
AI代码解释
复制
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	# 是否需要到注册中心检索服务信息
  • 注册中心项目:
代码语言:txt
AI代码解释
复制
1.在主类上标注@EnableEurekaServer注解开启EurekaServer服务,开启注册中心

服务注册

  • 将服务信息注册到注册中心上
  • 配置文件:
代码语言:txt
AI代码解释
复制
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)项目:
代码语言:txt
AI代码解释
复制
1.在主类上标注@EnableEurekaClient注解将服务提供者(Provider)服务注册到注册中心

服务发现

  • 从注册中心获取服务信息
  • 配置文件:
代码语言:txt
AI代码解释
复制
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)项目:
代码语言:txt
AI代码解释
复制
1.在SpringCloud有两种方式调用服务:Rest	Fegin(SpringCloud)
Rest:
- 使用RestTemplate,是SpringBoot的web组件,默认整合Ribbon负载均衡器.底层就是采用的HttpClient技术
- 创建RestTemplate并标注@Bean添加方法创建Http服务进行通信
- RestTemplate调用有两种方式:采用服务别名调用	直接url调用 
restTemplate.getForObject("providerName(替代IP地址)/providerUrl",String.class)
2.在主类上标注@EnableEurekaClient(@EnableDiscoveryClient)注解开启服务消费者(Consumer)从注册中心发现服务功能
3.使用Rest方式以别名方式调用需要依赖Ribbon负载均衡器,在RestTemplate方法上标注
  @LoadBalanced,让RestTemplate在请求时拥有客户端的负载均衡的能力
  • Ribbon负载均衡:
    • 在集群操作中:
      • 首先启动注册中心
      • 多个服务提供者(Provider)服务在启动时,把当前服务信息以别名的方式注册到注册中心
      • 多个服务消费者(Consumer)在调用接口的时候,使用服务别名从注册中心获取RPC远程调用地址
      • 服务消费者(Consumer)获取RPC远程调用地址后,先使用Ribbon负载均衡器实现负载均衡再使用本地HttpClient技术实现调用
    • 负载均衡基本策略: 轮询机制(默认)

集群

  • 微服务RPC远程过程调用协议的核心:服务治理:注册中心
  • 搭建注册中心集群: 可以解决注册中心故障导致整个微服务环境不可用的问题
  • Eureka高可用原理:
    • 默认情况下,Eureka是让服务注册的服务注册中心,不注册自己
    • Eureka高可用就是将自己作为服务向其它注册中心注册自己, 形成一组相互注册的服务注册中心,实现服务清单的互相同步, 达到高可用效果
  • 注册中心集群:
    • 在注册服务过程中,只会保证有一台注册中心有对应的服务信息数据即可,只有注册中心宕机后,才启动同步数据到其它注册中心
    • 配置文件:
代码语言:txt
AI代码解释
复制
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服务剔除
代码语言:txt
AI代码解释
复制
1.默认情况下,EurekaClient端定时向EurekaServer端发送心跳包
2.如果EurekaServer端在<一定时间>内没有收到EurekaClient端发送的心跳包,便会直接从服务注册列表中剔除该服务
3.在<短时间>内如果丢失了大量的服务实例心跳包,EurekaServer端会开启自我保护机制,不会剔除EurekaClient端
  • 在本地开发环境中,测试时建议关闭EurekaServer端自我保护机制,保证不可用服务及时被剔除:
代码语言:txt
AI代码解释
复制
配置文件:
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的临时节点类型
  • 临时节点和生命周期是相关联的,如果服务断开连接之后,临时节点就会被自动删除
代码语言:txt
AI代码解释
复制
配置文件:
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)在主类上标注@EnableDiscoveryClient注解向注册中心注册服务
2.ZookeeperClient-服务消费者(Consumer)在主类上标注@EnableDiscoveryClient注解从注册中心调用服务
3..在调用服务的方法上标注@LoadBalanced开启Ribbon的负载均衡功能进行服务的调用

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
代码语言:txt
AI代码解释
复制
配置文件:
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)在主类上标注@EnableDiscoveryClient注解向注册中心注册服务
2.ZookeeperClient-服务消费者(Consumer)在主类上标注@EnableDiscoveryClient注解从注册中心调用服务
3..在调用服务的方法上标注@LoadBalanced开启Ribbon的负载均衡功能进行服务的调用

DiscoveryClient

  • 获取注册中心的服务信息
  • 用于实现本地负载均衡
代码语言:txt
AI代码解释
复制
@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;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
学会two pointers算法,玩转LeetCode
今天给大家聊一个非常经典也非常简单的算法,学会了这个算法不说能够纵横leetcode,但可以解决非常多的问题。并且很多其他的算法也用到了类似的思想,非常有借鉴意义。
TechFlow-承志
2022/08/26
2610
学会two pointers算法,玩转LeetCode
【图解】三种解法不断优化带你手撕 LeetCode第三号题:无重复字符的最长子串
索引从字符串的第一位开始,将后面的字符依次加入到 set 里面。如果 set 里面已经有了该字符,此次循环结束,内循环结束后记录 size。字符串的每一位都用这种方法去计算,得到的最大的 size 即是答案。
帅地
2019/12/19
7920
【图解】三种解法不断优化带你手撕 LeetCode第三号题:无重复字符的最长子串
每日一题:LeetCode-LCR 016. 无重复字符的最长子串
   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️
用户11029129
2024/06/04
1150
每日一题:LeetCode-LCR 016. 无重复字符的最长子串
LeetCode热题100(滑动窗口篇)
这种子串子数组问题,而且还满足窗口的右边界右移动就是加,左边界右移就是减的问题大概率就是滑动窗口。
Yui_
2025/01/17
1160
LeetCode热题100(滑动窗口篇)
LeetCode 刷题笔记——day 2
思路:通过数组下标方式遍历字符串并逐个比较,需要考虑非常多种可能的输入。(多次修改后最终用经典暴力求解法得出(也许)准确的答案)
h-t-m
2022/11/22
3760
LeetCode 第3题 无重复字符的最长子串(小白详解)
输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
地鼠窝里有个Gopher
2022/10/30
2900
LeetCode3 一题学会尺取算法
我们先从最简单的方法开始,最容易想到的算法就是暴力枚举。我们可以遍历出这个字符串当中所有的子串,之后再判断这个子串当中有没有出现重复的元素。如果没有重复的元素,那么我们就更新答案。
TechFlow-承志
2020/03/05
4750
LeetCode3 一题学会尺取算法
LeetCode算法题 顶
第1题https://leetcode-cn.com/problems/two-sum/
算法之名
2020/03/19
3200
刷题日常(移动零,盛最多水的容器,三数之和,无重复字符的最长子串)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
用户11369558
2024/12/24
820
刷题日常(移动零,盛最多水的容器,三数之和,无重复字符的最长子串)
【刷穿 LeetCode】3. 无重复字符的最长子串(中等)
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
宫水三叶的刷题日记
2021/02/20
4050
【优选算法】——滑动窗口——3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。(即为连续的)
小李很执着
2024/06/15
2500
【优选算法】——滑动窗口——3. 无重复字符的最长子串
程序员进阶之算法练习(四十八)LeetCode
题目链接 题目大意: 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
落影
2020/10/27
4240
程序员进阶之算法练习(四十八)LeetCode
既是「滑动窗口」入门题,更是高频面试题 ...
这是 LeetCode 上的「3. 无重复字符的最长子串」,难度为 「Medium」。
宫水三叶的刷题日记
2021/02/26
4920
【Day34】LeetCode算法 -- 3. 无重复字符的最长子串
解题思路: 题目会给定一个字符串s,我们需要返回其中最长子串的长度,注意,这里返回的是最长子串长度而非最长子序列长度。例如:“abbcde”,最长子串是“bcde” ; 最长子序列是“abcde” ;
.29.
2022/11/15
2160
【Day34】LeetCode算法 -- 3. 无重复字符的最长子串
LeetCode-题库-刷题(1-3)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。 具体题目链接
布衣者
2021/09/07
7690
三分钟算法修行-无重复字符的最长子串的《四种解法》
  最近有小伙伴和我谈心,觉得刷算法题太难了,完全没有思路,很有挫败感,想要放弃了。想想自己也深有感触,有这些想法真都挺正常的,其实我们刷算法就是为了培养一个思考问题、解决问题的思维,这个思维养成并不是一蹴而就的,而是循序渐进的。
IT学习日记
2022/09/13
2.9K0
三分钟算法修行-无重复字符的最长子串的《四种解法》
刷题记录(LeetCode 100 热题系列)2
无重复字符的最长子串 LeetCode url (https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/)
猎户星座1
2021/01/17
3320
003. 无重复字符的最长子串 | Leetcode题解
题目要求连续, 我们考虑使用滑动窗口。而这道题就是窗口大小不固定的滑动窗口题目,然后让我们求满足条件的窗口大小的最大值,这是一种非常常见的滑动窗口题目。
苏南
2020/12/16
5620
003. 无重复字符的最长子串 | Leetcode题解
LeetCode 03无重复字符的最长子串(滑动窗口)
本题选择的思路是滑动窗口,滑动窗口,就是用一个区间从左往右,右侧先进行试探,找到区间无重复最大值,当有重复时左侧再往右侧移动一直到没重复,然后重复进行。在整个过程中找到最大的那个空间返回即可。
bigsai
2020/08/13
7040
LeetCode 03无重复字符的最长子串(滑动窗口)
leetcode刷题(3)——无重复字符的最长子串
输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2:
老马的编程之旅
2022/06/22
2080
推荐阅读
相关推荐
学会two pointers算法,玩转LeetCode
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档