Nacos框架服务注册实现流程

作者:kaico2018 时间:2023-07-07 10:18:30 

rpc远程调用

可能存在的问题

  • 超时的问题。

  • 安全的问题。

  • 服务与服务之间URL地址管理。

在我们的微服务架构通讯,服务之间依赖关系非常大,如果通过传统的方式管理我们服务的 url 地址的情况下,-一旦地址发生变化的情况下,还需要人工修改rpc远程调用地址。

微服务服务治理

在RPC远程调用过程中,服务与服务之间依赖关系非常大,服务Url地址管理非常复杂,所以这时候需要对我们服务的url实现治理,通过服务治理可以实现服务注册与发现、负载均衡、容错等。

分布式注册中心

在 rpc 远程调用中,地址中域名和端口号/调用的方法名称,如果基于数据库实现服务 url 治理:

缺点:维护成本高、没有完全绝对实现动态智能。

每次调用该服务如果地址直接写死的话,一旦接口发生变化的情况下,这时候需要重新发布版本才可以该接口调用地址,所以需要一个注册中心统一管理我们的服务注册与发现。

注册中心概念: 我们的服务注册到我们注册中心,key为服务名称、value为该服务调用地址,该类型为集合类型。Eureka、consul、zookeeper、nacos等。

注册中心原理:

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页面看到注册的服务信息。

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

标签:Nacos,服务,注册
0
投稿

猜你喜欢

  • Windows系统中Java调用cmd命令及执行exe程序的方法

    2021-11-27 23:00:02
  • C#定时器和随机数

    2023-10-28 15:30:34
  • 详解xamarin Android 实现ListView万能适配器

    2022-11-26 02:12:33
  • Java根据模板导出Excel报表并复制模板生成多个Sheet页

    2022-09-09 01:16:01
  • Gradle快速安装及入门

    2021-11-25 09:33:28
  • C# Color.FromArgb()及系统颜色对照表一览

    2021-05-24 08:21:02
  • Maven打包jar生成javadoc文件和source文件代码实例

    2021-08-22 21:56:52
  • mybatis注解与xml常用语句汇总

    2022-05-17 18:39:47
  • 你知道在Java中Integer和int的这些区别吗?

    2023-09-04 02:50:18
  • 升级dubbo2.7.4.1版本平滑迁移到注册中心nacos

    2021-11-17 04:03:34
  • Android应用开发中CardView的初步使用指南

    2022-12-30 02:04:47
  • 聊聊Java 中的线程中断

    2021-05-31 02:04:30
  • Java枚举详解及使用实例(涵盖了所有典型用法)

    2023-06-29 23:17:55
  • Flutter利用Hero组件实现自定义路径效果的动画

    2023-06-25 13:46:29
  • JAVA线程池原理实例详解

    2021-10-01 17:59:01
  • Android自定义TextView实现drawableLeft内容居中

    2022-04-24 18:20:14
  • 详解 C# 中XML对象的序列化和反序列化

    2022-06-24 12:55:27
  • 解析Android中webview和js之间的交互

    2023-07-27 17:16:50
  • 深入HRESULT与Windows Error Codes的区别详解

    2023-10-16 15:19:42
  • Java经验点滴:类注释文档编写方法

    2023-11-06 03:50:11
  • asp之家 软件编程 m.aspxhome.com