nacos生产者消费者相互调用(nacos保证的是什么)

http://www.itjxue.com  2023-01-25 13:20  来源:未知  点击次数: 

微服务初体验(二):使用Nacos作为配置中心并集成Dubbo

首先启动Nacos,按照上篇文章的步骤,启动Nacos服务和项目,访问Nacos的web页面。确保项目中的服务都注册到注册中心当中了。在application.yml同级目录下添加bootstrap.yml,在Spring boot项目中bootstrap.yml会比application.yml优先初始化,所以我们需要在bootstrap.yml中引入Nacos官方指定的配置文件即可(上篇文章中已经把Nacos作为配置中心的配置写入了application.yml,现在只需要把它从applicaiton.yml中剪切出来即可, 其中的spring:application:name会作为Nacos中新增配置时的Data ID,需要留意 ),再新增属性gorup进行分组测试,如下图

接着打开Nacos的服务的web页面,打开配置管理-配置列表,点击右侧新增按钮,进行新增。

Data ID: bootstrap.yml配置文件中spring:application:name对应的名称 ;

Group:指定分组(便于不同环境下的项目配置管理,因为笔者这里属于测试,所以填写的是和上文中的配置文件中group对应的test一致);

描述:针对于该配置的描述;

配置格式:配置文件的格式,要和Data ID中的后缀格式一致(这里笔者用的是yml,那么下面就选择yaml,注意该位置也可以选择properties,但是必须和上面bootstrap.yml文件中的file-extension的值相匹配);

配置内容:具体的配置内容(这里笔者将项目中的application.yml中的配置全部拷贝至其中);

测试启动consumer服务,在application.yml中为空的时候,项目启动端口还是如Nacos配置中的9011,说明项目依赖Nacos的配置中心成功,其他服务如法炮制即可:

新增一个测试Controller,然后加上@RefreshScope注解,表明该Controller中的配置数据为自动刷新 。

编辑Nacos中的配置文件consumer新增相关参数type: test,访问Controller,返回test。效果如下图:

将Nacos中consumer.yml文件的type: test修改为type: prod,在不重启项目的情况下重新访问对应的controller,效果如下图:

因为Dubbo是属于各个服务之间都要公用的依赖,所以将其引入cloud-common当中,详细的版本可以去 mvnrepository 搜索合适自己项目的

引入依赖后需要编写消费者服务中的配置文件,将Dubbo服务注册至Nacos,新增如下内容,其中subscribed-services指的是生产者服务,prot:-1指的是端口随机,registry:address:指的是Dubbo对应的注册中心那这里就应该设置为Nacos

接下来新增接口服务,项目类型为Maven项目,在项目中新增一个接口。并在cloud-provider(生产者)和cloud-consumer(消费者)pom.xml文件中都引入该模块

在生产者实际服务中实现该接口对应的方法

在服务消费者的Controller中引入该Service,并在该Service上加入@Reference注解,注意在引入jar包的时候选择带有Dubbo的,不要使用Jdk原生的

编写消费者服务中测试Dubbo调用的接口,进行测试,测试结果如下图:

nacos原理

0、服务容器负责启动,加载,运行服务提供者。

1、服务提供者在启动时,向注册中心注册自己提供的服务。

2、服务消费者在启动时,向注册中心订阅自己所需的服务。

3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Registry 就是注册中心,负责服务的注册与发现。Dubbo 有自己的 Registry 实现,而 Nacos 则是另一种 Registry 的实现。

负载均衡有很多种实现方式,包括轮询法,随机方法法,对请求ip做hash后取模等等,从负载的维度考虑又分为:服务端负载均衡和客户端负载均衡。

Nacos 的客户端在获取到服务的完整实例列表后,会在客户端进行负载均衡算法来获取一个可用的实例,模式使用的是随机获取的方式。

【Nacos专题】Nacos 快速入门

Nacos 英文全称 Dynamic Naming and Configuration Service,它是 Spring Cloud Alibaba 的核心组件之一,致力于微服务架构中的服务注册与发现、配置管理。

Nacos 将注册中心和配置中心整合在一起,提供了两个核心功能,即服务注册与发现和动态配置服务。

Nacos 支持基于 DNS 和 基于 RPC 的服务发现,服务提供者向 Nacos 服务端注册服务后,服务消费者可以从 Nacos 服务端获取注册列表。

提供了一个简洁易用的 UI,方便用户管理所有环境的应用配置和服务配置,消除了配置变更时服务需重新部署的过程。还提供了包括 配置版本跟踪 、 金丝雀发布 、 一键回滚配置 以及 客户端配置更新状态跟踪 在内的一系列开箱即用的配置管理特性,大大降低配置变更带来的风险。

Nacos 分为服务端和客户端,服务端用来提供服务发现与注册等功能,客户端就是不同的应用和服务。

在 Nacos 的 Release Notes 可以看到每个版本的相关介绍。当前最新的稳定版本是 1.4.0。

Nacos 服务需要 Java 运行环境,因此,在启动服务之前需要确保你的服务器已经有了 Java 运行环境,并且配置好了 JAVA_HOME 。

参数说明:

-m:指定运行模式,standalone 表示单机模式

在 Nacos 配置文件中配置服务器ip,默认的端口号为8848,默认的用户名和密码均为nacos,访问 便能够成功登Nacos管理后台。

(1) 引入依赖

在 SpringBoot 项目中引入 Nacos 客户端依赖,pom.xml 添加如下内容:

(2) 修改配置

在 application.properties 配置文件中添加 Nacos 的基本配置 (也可以是 application.yml )

1)application.properties

2)application.yml

(3) @EnableDiscoveryClient 注解

在 SpringBoot 的启动类上添加 @EnableDiscoveryClient 注解来开启服务注册。

Nacos Discovery 默认集成了 Netflix Ribbon,服务消费者可以使用 RestTemplate 或 OpenFeign 进行服务的调用。

(1) Nacos 启动时报如下错误

问题原因:通过yum命令安装的普通的openJDK没有javac等工具,而且安装完以后连环境变量都不需要配置,就能使用 java -version 验证。

解决方案:重新安装devel开发版openJDK,开发版的openJDK有javac工具,然后配置java环境变量即可。

(2) Nacos Provider 启动报错

问题原因:没有配置 Nacos 服务端的地址,因此,当 Nacos Provider 启动的时候,无法与注册中心通信

解决方案:在配置文件中配置 Nacos 服务端地址,如下所示:

71 nacos 实现微服务的注册与发现

1 微服务架构服务治理的概念

2, 基于nacos实现服务注册与发现

3, 使用Rest模板实现RPC调用

4,手写Rpc 客户端负载均衡算法。

SpringCloud 与SpringCloudlibaba的区别

SpringCloud rpc远程调用整合

1,nacos 分布式注册中心,分布式配置中心 SpringCloudEureka+config组合

SpringCloud rpc 远程调用整合。

1,nacos 分布式注册中心,分布式配置中心 SpringCloudEureka+cnfig组合

2,目的为了推广阿里云产品,如果使用了SpringCloudAlibaba 建议最好使用整个体系的产品。

mq,rocketmq

总结:

SpringcloudAlibaba 实际上对我们的SpringCloud 做扩展组件开发 nacos ,setata分布式解决框架, SchedulerX, Alibaba cloud OSS等,目的推广阿里云产品。

服务治理的基本概念:

服务治理的概念:

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

服务注册中心的概念:

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

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

服务注册: 我们生产者项目启动的时候,会将当前服务自己的信息地址注册到注册中心。

服务发现: 消费者从我们的注册中心上获取生产者调用的地址(集合),在使用负载均衡的策略获取集群中某个地址实现本地rpc远程调用。

微服务调用接口常用名词:

生产者: 提供接口被其他服务调用;

消费者: 调用生产接口实现消费

手动实现服务注册与发现:

1.实现服务注册 发送post请求:

' ;ip=20.18.7.10port=8080'

2.实现服务发现

u;/u

详细步骤操作: u;/u

nacos整合SpringCloud;

maven依赖:

会员服务(生产者)

服务接口:

服务接口

配置文件

application.yml文件

订单服务(消费者)

订单调用会员服务

负载均衡算法

Rpc 远程调用设计到本地负载均衡算法

1.从注册中心获取服务集群的列表

2.从列表选择一个 负载均衡算法有那些:

A.一致性hash计算

B.轮训 、权重

C.随机

nacos服务消费者

消费者跟提供者配置方式基本差不太多, 使用的时候提provider提供数据,而consumer调用provider,调用的方式有很多中,常用的有三种方式:

然在Nacos工程下创建一个子工程命名其pom文件与nacos-provider相同

pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="xml" cid="n14" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"?xml version="1.0" encoding="UTF-8"?

project xmlns=" " xmlns:xsi=" "

xsi:schemaLocation=" "

modelVersion4.0.0/modelVersion

parent

groupIdcom.zw/groupId

artifactIdspringcloud-alibaba-example/artifactId

version1.0-SNAPSHOT/version

relativePath../pom.xml/relativePath

/parent

artifactIdnacos-server-consumer/artifactId

version0.0.1-SNAPSHOT/version

namenacos-server-consumer/name

description消费者/description

properties

java.version1.8/java.version

/properties

dependencies

dependency

groupIdorg.springframework.boot/groupId

artifactIdspring-boot-starter-web/artifactId

/dependency

dependency

groupIdcom.alibaba.cloud/groupId

artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId

/dependency

/dependencies

/project/pre

pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="yaml" cid="n16" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"spring:

cloud:

nacos:

discovery:

cluster-name: nacos-server-consumer

server-addr: 119.23.190.71:8848/pre

pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n18" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"@SpringBootApplication

@EnableDiscoveryClient

public class NacosConsumerApplication {

public static void main(String[] args) {

SpringApplication.run(NacosConsumerApplication.class, args);

}/pre

pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n21" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"@Configuration

public class RestTemplateConfiguration {

@Bean

//RestTemplate在请求时拥有客户端负载均衡的能力

@LoadBalanced

public RestTemplate restTemplate() {

return new RestTemplate();

}

}

/pre

pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n23" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"@Service

public class NacosConsumerServiceImpl implements NacosConsumerService {

@Resource

private RestTemplate restTemplate;

@Override

public String getData() {

return restTemplate.getForObject(" ", String.class);

}

}

/pre

登录Nacos控制台,在服务列表选项卡中看到我们的两个应用,并可以对其进行简单的监控和管理。

浏览器中访问服务消费者的接口 可以看到成功返回结果

(责任编辑:IT教学网)

更多

相关mac苹果系统文章

推荐mac苹果系统文章