6-使用nacos作为注册中心

news2025/1/11 18:29:39

本文讲解项目中集成nacos,并将nacos作为注册中心使用的过程。本文不涉及nacos的原理。

1、项目简介

以一个演示项目为例,项目包含三个服务,调用及依赖如下图:
在这里插入图片描述
由图中可以看出,coupon-customer-serv为服务的消费者,coupon-calculation-serv和coupon-template-serv为服务的提供者。业务简述如下表:

序号服务名称服务描述
1coupon-template-serv优惠卷模板服务,提供模板的创建功能。比如打折优惠券,当用户领取优惠卷时,优惠卷由模板生成,而具体打折多少,由商家指定。
2coupon-calculation-serv优惠卷计算服务。当用户支付订单时,根据用户购买的商品和已有的优惠券,计算实际支付的货款。
3coupon-customer-serv用户服务。包含用户领取优惠券、支付等功能。

2、主要依赖的版本

  • springboot:2.4.2
  • spring cloud:2020.0.1
  • spring cloud alibaba:2021.1

3、开工

关于springboot项目的搭建,此处略过。此处只讨论spring cloud相关的内容。先集成服务提供者(coupon-template-serv、coupon-calculation-serv),再集成服务消费者。

3.1、模块内部结构介绍

下面从coupon-template-serv服务开始,集成nacos。该服务的目录结构如下:
在这里插入图片描述
内部各模块介绍:

  • coupon-template-api:存放该项目用到dto类
  • coupon-template-dao: 数据库操作模块
  • coupon-template-impl: 服务层和controller保存的地方,也是springboot的入口。

3.2、引入依赖

打开coupon-template-serv模块下的pom.xml文件(也就是模块的根pom.xml),添加如下依赖:

 <!--spring cloud -->
 <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>2020.0.1</version>
      <type>pom</type>
      <scope>import</scope>
  </dependency>

  <!--spring cloud alibaba -->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2021.1</version>
      <type>pom</type>
      <scope>import</scope>
  </dependency>

打开coupon-template-impl模块下的pom.xml文件,添加nacos依赖:

<dependency>
   <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3.3、配置nacos服务发现

打开coupon-template-impl下的application.yml文件,添加如下配置:

 spring:
	 cloud:
	    nacos:
	      discovery:
	        # Nacos的服务注册地址,可以配置多个,逗号分隔
	        server-addr: 192.168.110.165:8848,192.168.110.165:8948
	        # 服务注册到Nacos上的名称,一般不用配置
	        service: coupon-template-serv
	        # nacos客户端向服务端发送心跳的时间间隔,时间单位其实是ms
	        heart-beat-interval: 5000
	        # 服务端没有接受到客户端心跳请求就将其设为不健康的时间间隔,默认为15s
	        # 注:推荐值该值为15s即可,如果有的业务线希望服务下线或者出故障时希望尽快被发现,可以适当减少该值
	        heart-beat-timeout: 20000
	        # 元数据部分 - 可以自己随便定制
	        metadata:
	          mydata: abc
	        # 客户端在启动时是否读取本地配置项(一个文件)来获取服务列表
	        # 注:推荐该值为false,若改成true。则客户端会在本地的一个
	        # 文件中保存服务信息,当下次宕机启动时,会优先读取本地的配置对外提供服务。
	        naming-load-cache-at-start: false
	        # 命名空间ID,Nacos通过不同的命名空间来区分不同的环境,进行数据隔离,
	        namespace: dev
	        # 创建不同的集群
	        cluster-name: Cluster-A
	        # [注意]两个服务如果存在上下游调用关系,必须配置相同的group才能发起访问
	        group: myGroup
	        # 向注册中心注册服务,默认为true
	        # 如果只消费服务,不作为服务提供方,倒是可以设置成false,减少开销
	        register-enabled: true

配置的注释比较详细,可以对照着看。注意nacos的ip地址和端口改成你自己的。

3.4、验证集成成功

启动nacos,再启动coupon-template-impl,仔细观察打印的日志,如图:

在这里插入图片描述
再打开nacos管理端,看服务的注册情况,因为我们的服务注册在namespace dev下,所以看dev:
在这里插入图片描述
至此,服务提供者集成完毕,并验证成功。
coupon-calculation-serv服务也是服务提供者,集成过程类似,此处不再赘述。

3.5、服务消费者coupon-customer-serv集成

项目结构如图:
在这里插入图片描述

3.5.1、添加依赖

根pom.xml与上面一致,但是作为服务的消费者,需要配置负载均衡等依赖。所以,打开
coupon-custom-impl模块的pom.xml文件,添加以下依赖:

<!--服务发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--负载均衡-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

<!--webflux调用-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

再配置application.yml文件,它与上面两个服务配置一样,保证服务名称不一致就行了。再次查看nacos管理端,现在有三个服务在注册中心。
在这里插入图片描述

4、发起远程调用

这里用webflux发起调用,有兴趣的同学去网上查一下资料,这里仅展示一下调用的代码:

 ...
 CouponTemplateInfo templateInfo = webClientBuilder.build()
                .get()
                .uri("http://coupon-template-serv/template/getTemplate?id=" + request.getCouponTemplateId())
                .retrieve()
                .bodyToMono(CouponTemplateInfo.class)
                .block();

注意:uri中用的是服务名而不是ip地址+端口,这样调用时,nacos会把具体的地址给调用方,另一个,还有负载均衡的意思。因为实际中用webflux调用的比较少,话不多说。

注入webClientBuilder对象:

 @Autowired
 private WebClient.Builder webClientBuilder;

webClientBuilder对象的配置:

@org.springframework.context.annotation.Configuration
public class Configuration {

    @Bean
    @LoadBalanced
    public WebClient.Builder register() {
        return WebClient.builder();
    }
}

5、三个服务git

coupon-template-serv
coupon-calculation-serv
coupon-custom-serv
Ok, Have a nice day!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1240778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础教程: sorted 函数

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 sorted 可以对所有可迭代的对象进行排序操作&#xff0c; sorted 方法返回的是一个新的 list&#xff0c;而不是在原来的基础上进行的操作。 从新排序列表。 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程…

9.4 Windows驱动开发:内核PE结构VA与FOA转换

本章将继续探索内核中解析PE文件的相关内容&#xff0c;PE文件中FOA与VA,RVA之间的转换也是很重要的&#xff0c;所谓的FOA是文件中的地址&#xff0c;VA则是内存装入后的虚拟地址&#xff0c;RVA是内存基址与当前地址的相对偏移&#xff0c;本章还是需要用到《内核解析PE结构导…

【论文阅读笔记】Emu Edit: Precise Image Editing via Recognition and Generation Tasks

【论文阅读笔记】Emu Edit: Precise Image Editing via Recognition and Generation Tasks 论文阅读笔记论文信息摘要背景方法结果额外 关键发现作者动机相关工作1. 使用输入和编辑图像的对齐和详细描述来执行特定的编辑2. 另一类图像编辑模型采用输入掩码作为附加输入 。3. 为…

第三节-Android10.0 Binder通信原理(三)-ServiceManager篇

1、概述 在Android中&#xff0c;系统提供的服务被包装成一个个系统级service&#xff0c;这些service往往会在设备启动之时添加进Android系统&#xff0c;当某个应用想要调用系统某个服务的功能时&#xff0c;往往是向系统发出请求&#xff0c;调用该服务的外部接口。在上一节…

Vue批量全局处理undefined和null转为““ 空字符串

我们在处理后台返回的信息&#xff0c;有的时候返回的是undefined或者null&#xff0c;这种字符串容易引起用户的误解&#xff0c;所以需要我们把这些字符串处理一下。 如果每个页面都单独处理&#xff0c;那么页面会很冗余&#xff0c;并且后期如果有修改容易遗漏&#xff0c…

生成式AI与大语言模型,东软已经准备就绪

伴随着ChatGPT的火爆全球&#xff0c;数以百计的大语言模型也争先恐后地加入了这一战局&#xff0c;掀起了一场轰轰烈烈的“百模大战”。毋庸置疑的是&#xff0c;继方兴未艾的人工智能普及大潮之后&#xff0c;生成式AI与大语言模型正在全球开启新一轮生产力革新的科技浪潮。 …

PostgreSQL (Hologres) 日期生成

PostgreSQL 生成指定日期下一个月的日期 &#xff08;在Hologres中&#xff0c;不支持递归查询&#xff09; SELECTto_char(T, YYYYMMDD)::int4 AS date_int,date(T) AS date_str,date_part(year, T)::int4 AS year_int,date_part(month, T)::int4 AS month_int,date_part(da…

中职组网络安全B模块-渗透提权2

任务五&#xff1a;渗透提权2 任务环境说明&#xff1a; 仅能获取xxx的IP地址 用户名&#xff1a;test&#xff0c;密码&#xff1a;123456 访问服务器主机&#xff0c;找到主机中管理员名称&#xff0c;将管理员名称作为Flag值提交&#xff1b; Flag:doyoudoyoudo 访问服…

使用Pytorch从零开始构建DCGAN

在本文中&#xff0c;我们将深入研究生成建模的世界&#xff0c;并使用流行的 PyTorch 框架探索 DCGAN&#xff08;生成对抗网络 (GAN) 的一种变体&#xff09;的实现。具体来说&#xff0c;我们将使用 CelebA 数据集&#xff08;名人面部图像的集合&#xff09;来生成逼真的合…

微服务学习|初识Docker、使用Docker、自定义镜像、DockerCompose、Docker镜像仓库

初识Docker 项目部署的问题 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题 依赖关系复杂&#xff0c;容易出现兼容性问题 开发、测试、生产环境有差异 Docker如何解决依赖的兼容问题的? 将应用的Libs (函数库)、Deps (依赖)配置与应用…

c语言:用迭代法解决递归问题

题目&#xff1a; 解释&#xff1a;题目的意思就是用迭代法的空间和时间复杂的太高了&#xff0c;需要我们减小空间与时间的复杂度&#xff0c;我就想到了迭代法&#xff0c;思路和代码如下&#xff1a; #include <stdio.h> //这里是递归法转迭代法 int main() {int x,i…

Spark---转换算子、行动算子、持久化算子

一、转换算子和行动算子 1、Transformations转换算子 1&#xff09;、概念 Transformations类算子是一类算子&#xff08;函数&#xff09;叫做转换算子&#xff0c;如map、flatMap、reduceByKey等。Transformations算子是延迟执行&#xff0c;也叫懒加载执行。 2)、Transf…

Leetcode——121 买卖股票的最佳时机

(超时。。。。。。&#xff09;除了暴力法我是真的。。。。。。 class Solution {public int maxProfit(int[] prices) {int len prices.length;int max0;for(int i0;i<len-1;i){for(int ji1;j<len;j){int income prices[j] - prices[i];if(income>max){maxincome;…

路由的控制与转发原理

场景1&#xff1a;路由器收到数据包后&#xff0c;会根据数据包的目标IP地址&#xff0c;计算出目标网段&#xff0c;再确定终端设备的具体位置。这个过程中&#xff0c;还需要计算出接口&#xff0c;或数据包下一跳的地址。最终会生成一条路由&#xff0c;即路径&#xff0c;存…

外部中断为什么会误触发?

今天在写外部中断的程序的时候&#xff0c;发现中断特别容易受到干扰&#xff0c;我把手放在对应的中断引脚上&#xff0c;中断就一直触发&#xff0c;没有停过。经过一天的学习&#xff0c;找到了几个解决方法&#xff0c;所以写了这篇笔记。如果你的中断也时不时会误触发&…

基于JavaWeb+SSM+Vue教学辅助微信小程序系统的设计和实现

基于JavaWebSSMVue教学辅助微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 1.1 概述 随着信息时代的快速发展&#xff0c;互联网的优势和普及&#xff0c;人们生活…

二、防火墙-安全策略

学习防火墙之前&#xff0c;对路由交换应要有一定的认识 1、安全策略基本概念2、匹配顺序3、缺省包过滤4、安全策略发展史4.1.基于ACL包过滤4.2.融合UTM安全策略4.3.一体化安全策略 5、Local区域安全策略5.1.针对OSPF协议配置Local区域安全策略5.2.其他协议 6、ASPF6.1.帮助FTP…

PCIE链路训练-状态跳转1

A&#xff1a;12ms超时&#xff0c;或者再任何lane上检测到Electrical Idle Exit&#xff1b; B&#xff1a; 1.发送“receiver detection”之后没有一个lane的接收逻辑被rx检测到 2.不满足条件c&#xff0c;比如两次detection出现差别&#xff1b; C&#xff1a;发送端在没…

文本分析:NLP 魔法!

一、说明 这是一个关于 NLP 和分类项目的博客。NLP 是自然语言处理&#xff0c;目前需求量很大。让我们了解如何利用 NLP。我们将通过编码来理解流程和概念。我将在本博客中介绍 BagOfWords 和 n-gram 以及朴素贝叶斯分类模型。这个博客的独特之处&#xff08;这使得它很长&…

竞赛选题 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…