Nacos框架服务注册实现流程
作者:kaico2018 发布时间:2023-07-07 10:18:30
rpc远程调用
可能存在的问题
超时的问题。
安全的问题。
服务与服务之间URL地址管理。
在我们的微服务架构通讯,服务之间依赖关系非常大,如果通过传统的方式管理我们服务的 url 地址的情况下,-一旦地址发生变化的情况下,还需要人工修改rpc远程调用地址。
微服务服务治理
在RPC远程调用过程中,服务与服务之间依赖关系非常大,服务Url地址管理非常复杂,所以这时候需要对我们服务的url实现治理,通过服务治理可以实现服务注册与发现、负载均衡、容错等。
分布式注册中心
在 rpc 远程调用中,地址中域名和端口号/调用的方法名称,如果基于数据库实现服务 url 治理:
缺点:维护成本高、没有完全绝对实现动态智能。
每次调用该服务如果地址直接写死的话,一旦接口发生变化的情况下,这时候需要重新发布版本才可以该接口调用地址,所以需要一个注册中心统一管理我们的服务注册与发现。
注册中心概念: 我们的服务注册到我们注册中心,key为服务名称、value为该服务调用地址,该类型为集合类型。Eureka、consul、zookeeper、nacos等。
注册中心原理:
服务注册:生产者项目启动的时候,会将当前服务自己的信息地址注册到注册中心。
服务发现: 消费者从我们的注册中心上获取生产者调用的地址(集合),在使用负载均衡的策略获取集群中某个地址实现本地rpc远程调用。
rpc 服务注册调用实现原理:
1、生产者启动的时候key= 服务的名称value ip 和端口号注册到我们的微服务注册中心上。
2、注册存放服务地址列表类型:key唯一,列表是list集合。
3、我们的消费者从我们注册中心.上根据服务名称查询服务地址列表(集合)。
4、消费者获取到集群列表之后,采用负载均衡器选择一个地址实现rpc远程调用。
Nacos
介绍
Nacos 可以实现分布式服务注册与发现/分布式配置中心框架。
官网的介绍: https://nacos.io/zh-cn/docs/what-is-nacos.html
安装
下载直接启动就可以了,nacos 是springboot项目。默认端口号是:8848,可以修改配置文件修改端口号、数据持久化方式等等。
注意:高一点版本的nacos默认是集群启动,如果你是学习使用单机版的,需要修改额外配置,改成单机版启动。
windows版本修改方式:以notepad++方式打开 startup.cmd
然后修改大概在26行的set MODE="cluster"为set MODE=“standalone”
基本使用
maven依赖
<dependencies>
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
</dependencies>
application.yml
spring:
cloud:
nacos:
discovery:
###服务注册地址
server-addr: www.kaicostudy.com:8848
application:
name: kaico-member
server:
port: 8081
Java代码,项目为springboot项目,menber服务
@RestController
public class MenberService {
@Value("${server.port}")
private String serverPort;
/**
* 会员服务提供的接口
*
* @param userId
* @return
*/
@RequestMapping("/getUser")
public String getUser(Integer userId) {
return "kaico学习nacos:" + serverPort;
}
}
启动项目之后,可以在nacos页面看到注册的服务信息。
使用discoveryClient 从nacos上获取接口地址
order服务代码,后面用作restTemplate 实现远程接口调用。
@RestController
public class OrderService {
@Autowired
private DiscoveryClient discoveryClient;
/**
* 订单调用会员服务
*
* @return
*/
@GetMapping("/orderToMember")
public String orderToMember() {
// 从注册中心上获取该注册服务列表
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("kaico-member");
ServiceInstance serviceInstance = serviceInstanceList.get(0);
URI rpcMemberUrl = serviceInstance.getUri();
return "订单调用会员获取结果:" + rpcMemberUrl;
}
}
使用restTemplate实现rpc远程调用
注意spring没有将 restTemplate 注入到IOC容器中,需要自己手动注入。在启动类中添加下面注入bean的方法。
@Bean("restTemplate")
public RestTemplate restTemplate(){
return new RestTemplate();
}
调用方法
@GetMapping("/orderToMember")
public String orderToMember() {
// 从注册中心上获取该注册服务列表
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("kaico-member");
ServiceInstance serviceInstance = serviceInstanceList.get(0);
URI rpcMemberUrl = serviceInstance.getUri();
// 使用本地rest形式实现rpc调用
String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
return "订单调用会员获取结果:" + result;
}
本地负载均衡算法
1、从注册中心获取服务集群的列表
2、从列表中选择一个(根据负载均衡算法来获取)
1. 随机获取
2. 轮训、权重
3. 一致性 hash 计算
实现轮训代码案例:
@Component
public class RotationLoadBalancer implements LoadBalancer {
private AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances) {
int index = atomicInteger.incrementAndGet() % serviceInstances.size();
ServiceInstance serviceInstance = serviceInstances.get(index);
return serviceInstance;
}
}
@RequestMapping("/orderToMember")
public String orderToMember() {
// 从注册中心上获取该注册服务列表
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("kaico-member");
ServiceInstance serviceInstance = loadBalancer.getSingleAddres(serviceInstanceList);
URI rpcMemberUrl = serviceInstance.getUri();
// 使用本地rest形式实现rpc调用
String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
return "订单调用会员获取结果:" + result;
}
来源:https://blog.csdn.net/weixin_44044929/article/details/124432123


猜你喜欢
- 一、为什么要学习并发编程对于 “我们为什么要学习并发编程?” 这个问题,就好比 “我们为什么要学习政治?” 一样,我们(至少作为学生党是这样
- 介绍Java桥梁模式(也称桥接模式)(Bridge Pattern)是一种设计模式,它将抽象和实现分离,使它们可以独立地变化.它通过一个大类
- NameServer1.架构设计消息中间件的设计思路一般都是基于主题订阅与发布的机制,RocketMQ也不例外。RocketMQ中,消息生产
- 今天安装了jdk1.8、tomcat8、和maven3.5.2,弄好后在myeclipse新建了一个maven项目,项目默认是jdk1.5,
- 提到Java发送HTTP请求,大家首先想到的是用apache的HttpClient,或者squareup的OkHttp。而在Java11之前
- 先给大家展示下效果图:废话不多说了,下面通过示例代码给大家介绍checkbox 多项选择当前的position信息提交,具体代码如下所示:p
- 关于[Cannot determine value type from string ‘xxx’]的
- @ApiImplicitParam作用在方法上,表示单独的请求参数参数name:参数名。value:参数的具体意义,作用。required:
- 最近项目中有截屏的需求,普通的view截屏方法网上一搜一大把,但是SurfaceView截屏黑屏问题很多文章说的并不清楚,自己参考了一些别的
- 目录一、首先模型本身需要特殊处理二、编写Shader三、讲解先上图看看效果:下面详细分享一下制作步骤吧:一、首先模型本身需要特殊处理二、编写
- 一、JDBC简介JDBC是连接java应用程序和数据库之间的桥梁。什么是JDBC?Java语言访问数据库的一种规范,是一套API。JDBC
- 本文主要学习Java构造器与传值,供大家参考,具体内容如下构造器构造器介绍构造器是Java学习中一个很重要的概念,每个类的对象在使用关键字n
- 注:底色透明是否生效与android版本有关,版本过低设置无效1.在main.dart内设置void main(){ runApp(new
- Java main 方法面试题的详细整理1.不用main方法如何定义一个类?不行,没有main方法我们不能运行Java类。在java 7之前
- Unity如何实现换装系统,供大家参考,具体内容如下1.创建Sprite Library Asset2.添加新目录Label 可以理解为标签
- 前言:本人目前从事java开发,但同时也在学习各种前端技术,下面是我做的一个前后端分离项目的一个小案例,不足之处请多多指教1. 项目技术选型
- springboot整合vue实现上传下载文件,供大家参考,具体内容如下环境springboot 1.5.x完整代码下载:springboo
- 本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法。分享给大家供大家参考。具体分析如下:微信服务器在5秒内收不到响应会断掉连接,
- 思想利用栈和队列都可以实现树的迭代遍历。递归的写法将这个遍历的过程交给系统的堆栈去实现了,所以思想都是一样的、无非就是插入值的时机不一样。利
- 先创建一个CacheHelper.cs类,代码如下:using System;using System.Web;using System.C