Nacos框架服务注册实现流程

目录
  • rpc远程调用
  • 微服务服务治理
  • 分布式注册中心
  • Nacos
    • 介绍
    • 安装
    • 基本使用

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;
    }

到此这篇关于Nacos框架服务注册实现流程的文章就介绍到这了,更多相关Nacos服务注册内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 聊聊SpringBoot使用Nacos进行服务注册发现与配置管理问题

    前提 最近由于业务发展,需要调研一套完善和主流的基础架构,进行中台化(微服务)的实施,考虑到技术栈切换到SOFAStack.既然整个体系都切换到蚂蚁金服的技术栈,那么自然考虑一些基础组件如服务注册发现.配置管理等都切换为阿里的技术栈.考虑到目前比较热的服务发现组件是Nacos,需要调研SpringBoot服务接入Nacos的可行性,为以后强制要求新服务使用SOFAStack + Nacos的技术栈进行服务开发打下基础. Nacos简介 Nacos英文全称Dynamic Naming and Co

  • Spring Cloud Alibaba Nacos服务治理平台,服务注册、RestTemplate实现微服务之间访问负载均衡访问的问题

    目录 Nacos简介 ☘Spring Cloud 组件依赖版本 ☘Nacos部署 ☘访问Nacos平台 Nacos服务注册.微服务访问.负载均衡实现 nacos-consumer微服务创建 ☘nacos-provider微服务创建 测试 Nacos简介 Github:https://github.com/alibaba/nacos官网文档:https://nacos.io/zh-cn/docs/what-is-nacos.htmlNacos 提供了发现.配置和管理微服务能力,能快速实现动态服务发

  • dubbo服务注册到nacos的过程剖析

    目录 前言 简述过程 源码剖析具体实现 服务注册 服务订阅 结语 前言 前面聊到到了我们的dubbo服务从redis迁移到nacos注册中心,迁移后发现,会时不时的抛一个异常 ERROR com.alibaba.nacos.client.naming - [CLIENT-BEAT] failed to send beat:, 所以有了这个剖析过程,当然最后查明异常是我们的SLB网络映射问题,和nacos没有关系. dubbo版本:2.7.4.1 nacos client版本:1.0.0 naco

  • Nacos集群模式下服务无法注册问题

    目录 Nacos集群模式下服务无法注册 一.环境 二.nacos服务端搭建 三.服务注册 四.问题追踪 五.解决 服务没有注册到nacos的原因分析 Nacos集群模式下服务无法注册 一.环境 1.服务器:腾讯云 CentOS 7.2 64位 机器三台 2.JDK1.8.0_151(由于nacos必须1.8以上),1.8以下会有启动问题,务必升级 3.nacos版本0.8.0 二.nacos服务端搭建 基本按照官网文档就能搭建起来,另外按照官网文档修改了cluster.conf,添加了三台机器的

  • SpringCloud通过Nacos实现注册中心与远程服务调用详解流程

    目录 1. 基于Nacos实现服务注册与发现 1.1 pom依赖 1.2 yaml配置 1.3 添加启动注解 1.4 启动服务查看控制台 2.基于Nacos实现远程服务调用 2.1 客户端创建RestTemplate Bean 2.2 客户端调用代码 2.3 服务端暴露接口 2.4 服务调用测试 本文主要记录基于Nacos实现服务注册中心和远程服务调用 1. 基于Nacos实现服务注册与发现 基于pring-boot-starter-parent 2.6.8,pring-cloud-depend

  • SpringCloud 服务注册中的nacos实现过程

    如下图,org.springframework.cloud.spring-cloud-commons包下定义了一系列接口,其中就包括serviceregistry的系列规范,并通过SPI机制去调用接口实现. 在该包的META-INF/spring.factories文件中,可以找到EnableAutoConfiguration.class为key的value中有AutoServiceRegistrationAutoConfiguration.class这一项. 来看看这个AutoServiceR

  • Nacos框架服务注册实现流程

    目录 rpc远程调用 微服务服务治理 分布式注册中心 Nacos 介绍 安装 基本使用 rpc远程调用 可能存在的问题 超时的问题. 安全的问题. 服务与服务之间URL地址管理. 在我们的微服务架构通讯,服务之间依赖关系非常大,如果通过传统的方式管理我们服务的 url 地址的情况下,-一旦地址发生变化的情况下,还需要人工修改rpc远程调用地址. 微服务服务治理 在RPC远程调用过程中,服务与服务之间依赖关系非常大,服务Url地址管理非常复杂,所以这时候需要对我们服务的url实现治理,通过服务治理

  • 分布式医疗挂号系统Nacos微服务Feign远程调用数据字典

    目录 步骤1:向Nacos服务中心注册微服务 (1)引入Nacos依赖 步骤2:使用Feign进行远程调用 (1)service-hosp医院列表接口 (2)service-cmn医院等级/地址接口 (3)引入Feign依赖 (4)调用端通过包扫描Feign (5)远程调用 步骤3:使用swagger测试 需求:制作一个医院列表的显示功能.列表中包含医院编号.医院等级.医院地址.状态等.分析:首先确定是典型的条件查询带分页.由于医院的等级需要查询数据字典部分,这个调用是在不同的微服务模块中,这就

  • SpringBoot实现服务接入nacos注册中心流程详解

    目录 概述 接入nacos注册中心 springboot服务pom文件 application.properties配置 源码分析 小结 源码流程图 概述 某些场景下只需要把springboot微服务化而不想引入springcloud如何实现的呢? 下面我们介绍nacos注册中心方案. 接入nacos注册中心 springboot服务pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="h

  • 为WPF框架Prism注册Nlog日志服务

    无论是Nlog还是Serilog, 它们都提供了如何快速在各类应用程序当中的快速使用方法. 尽管,你现在无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来做到着一点, 因为日志框架都提供了IServiceCollection的扩展. 但是, 如果现在你使用的是Prism 8.0的应用程序, Prism提供了多种容器的支持, 例如:DryIoc或者Unity, 这个时候我们如果现在这个基础上实现依赖注入,首先我们需要修改Prism当中创建容器的默认实现

  • Spring Cloud Eureka服务注册中心入门流程分析

    目录 项目搭建 客户端注册 聚合层处理 Eureka架构 集群搭建 多区域配置 自我保护开关 心跳机制 Eureka实例信息存储 项目地址 在学习Ribbon使用的时候,我们是直接在配置文件中写死服务地址的,是不是特别的不方便?我们是不是需要一个统一的地方来维护这些服务,以及这些配置发生变化后,我们不需要重启服务. 所以这个时候需要引出一个新组件——eureka. 它主要可以帮助我们实现如下功能: 地址的统一维护服务提供者的动态上下线通知 服务提供者可以将服务注册到eureka上,eureka通

  • Springcloud中的Nacos Config服务配置流程分析

    目录 简介 nacos config快速开始 依赖引入 配置nacos config 启动测试 配置动态更新配置 简介 前边写过几个微服务,订单微服务,商品微服务,账户微服务,库存微服务,每个微服务都去配置自己的配置文件,每个微服务一个yml配置文件,这样如果微服务足够多,对于配置文件的管理就很麻烦,如果配置文件变动需要更改,则需要我们一个一个的去改.例如开发环境,测试环境,生产环境等等,而且配置文件无法实时更新.我们修改了配置文件之后,必须重新启动微服务才能使配置生效.配置中心就可以解决配置问

随机推荐