当前位置: 首页 > news >正文

【SpringCloud】2.0 服务治理——nacos

微服务架构

  • SpringCloud
    服务注册发现:Nacos
    服务限流降级:Sentinel
    分布配置中⼼:Nacos
    分布式事务保证数据一致性:Seata
    分布式定时任务:Spring Scheduling Tasks
    服务⽹关:SpringCloud Gateway
    异步消息削峰填谷:RocketMQ
    服务之间调⽤:OpenFeign、Ribbon
    链路追踪:Sleuth+Zipkin

技术栈版本控制

序号名称版本用途备注
1openJDK21Java JDK
2postgresSQL17.4基础数据库
3Maven3.9.9Java第三方依赖包管理工具
4springboot3.4.3Java MVC框架
5springcloud2024.0.1微服务框架
6springcloud Alibaba2023.0.3.2阿里巴巴微服务框架扩展

组件版本控制

序号名称版本用途备注
1Nacos2.5.1服务注册发现、分布配置中⼼
2Sentinel1.8.8服务限流降级面向云原生微服务的高可用流控防护组件
3Seata2.3.0分布式事务保证数据一致性

什么是注册中心(服务治理)

  • 服务注册:服务提供者provider,启动的时候向注册中心上报自己的网络信息
  • 服务发现:服务消费者consumer,启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络信息
  • 核心:服务管理,是有个服务注册表,心跳机制动态维护,服务实例在启动时注册到服务注册表,并在关闭时注销。

为什么要用

微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大问题

主流的注册中心:zookeeper、Eureka、consul、etcd、Nacos

AlibabaCloud搭配最好的是Nacos,且服务的注册发现之外,还支持动态配置服务

这里我买了一个云服务器。
nacos下载二进制包即可。
https://nacos.io/download/nacos-server/
这里我用的是最新稳定版2.5.1。

把zip包放到云服务器,并解压:


image.png

安装openjdk21(java8以上都行)

unzip ./nacos-server-2.5.1.zip
sudo apt update
sudo apt install openjdk-21-jdk -y
java -version

下载nacos-server-2.5.1.tar.gz

https://github.com/alibaba/nacos/tags

解压安装包
解压Nacos压缩包。

tar -zxvf nacos-server-2.5.1.tar.gz

进入Nacos目录。

cd /home/ubuntu/nacos

启动Nacos,可以选择单机模式运行。

bash bin/startup.sh -m standalone  -Dnacos.home=/home/ubuntu/nacos
image.png

如果是云服务记得把防火墙打开:


image.png

访问 localhost:8848/nacos(我的是http://106.55.xxx.xxx:8848/nacos)
默认账号密码 nacos/nacos

image.png

这里只需要用到nacos的服务管理功能。

设置nacos鉴权

Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权。
https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
打开服务器/home/ubuntu/nacos/conf中的application.properties:
修改如下:

### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=nacos
### 开启鉴权
nacos.core.auth.enabled=true
### The default token (Base64 String):
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
### 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
### 配置自定义身份识别的key(不可为空)和value(不可为空)
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacos

重启nacos:

bash /home/ubuntu/nacos/bin/shutdown.sh
cd /home/ubuntu/nacos && bash /home/ubuntu/nacos/bin/startup.sh -m standalone

登录:


image.png

基于nacos——实现实现订单-视频服务之间的调用

视频服务集成Nacos

添加依赖

<!--添加nacos客户端-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

因为一些我搞不清楚的原因 ,idea的maven无法install依赖包,一直红色,但install又成功无报错。

解决办法:单独拉取

用管理员权限打开命令提示符,demo如下:

mvn dependency:get -DremoteRepositories=https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -DgroupId=com.alibaba.cloud -DartifactId=spring-cloud-starter-alibaba-nacos-discovery -Dversion=2023.0.1.2mvn dependency:get -DremoteRepositories=https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -DgroupId=com.github.pagehelper -DartifactId=pagehelper-spring-boot-starter -Dversion=2.1.0

然后idea右击项目名称,maven->重新加载项目即可。

接下来报错


image.png

yml中添加

spring:cloud:nacos:config:import-check:enabled: false

加上后仍然报错

2024-09-01T20:58:12.607+08:00  WARN 42708 --- [online-edu-video-service] [ing.grpc.redo.0] com.alibaba.nacos.client.naming          : Grpc Connection is disconnect, skip current redo task
2024-09-01T20:58:12.909+08:00 ERROR 42708 --- [online-edu-video-service] [           main] c.a.n.c.remote.client.grpc.GrpcClient    : Server check fail, please check server 106.55.179.127 ,port 9848 is available , error ={}

还需要把7848、9848都暴露出来。(这里我暴露了7848,8848,8849,9848,9849五个接口)


image.png

然后又报错use is null等错误。
最后解决如下:

实际在我们父项目引入spring-cloud-alibaba-dependencies后,相当于引入了一系列版本管控好的包。

image.png

所以只要是其中的包,都不需要单独引入,子项目用的2时候,单独引入下面的子依赖包即可。
因此优化online-edu\pom.xml

这里我开始删除lombok包,因为他的一些缺陷并不想用,因此去掉。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.online_edu</groupId><artifactId>online-edu</artifactId><version>1.0-SNAPSHOT</version><modules><module>online-edu-common</module><module>online-edu-video-service</module><module>online-edu-user-service</module><module>online-edu-order-service</module><module>online-edu-generator</module></modules><!-- 一般来说父级项目的packaging都为pom,packaging默认类型jar类型--><packaging>pom</packaging><properties><java.version>21</java.version><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- **************************** 分布式核心 **************************** --><spring-boot-dependencies.version>3.3.4</spring-boot-dependencies.version><spring-cloud-dependencies.version>2023.0.5</spring-cloud-dependencies.version><spring-cloud-alibaba-dependencies.version>2023.0.3.2</spring-cloud-alibaba-dependencies.version><spring-cloud-starter-loadbalancer.version>4.2.1</spring-cloud-starter-loadbalancer.version><spring-cloud-starter-openfeign.version>4.2.1</spring-cloud-starter-openfeign.version><!-- **************************** 分布式核心 **************************** --><!-- **************************** 数据库依赖 **************************** --><mybatis-plus-spring-boot3-starter.version>3.5.10.1</mybatis-plus-spring-boot3-starter.version><mybatis-plus-generator.version>${mybatis-plus-spring-boot3-starter.version}</mybatis-plus-generator.version><postgresql.version>42.7.5</postgresql.version><druid-spring-boot-3-starter.version>1.2.24</druid-spring-boot-3-starter.version><pagehelper-spring-boot-starter.version>2.1.0</pagehelper-spring-boot-starter.version><!-- **************************** 数据库依赖 **************************** --><!-- **************************** 工具类 **************************** --><org.mapstruct.version>1.6.0</org.mapstruct.version><commons-collections4.version>4.5.0-M3</commons-collections4.version><guava.version>33.4.5-jre</guava.version><hutool-all.version>5.8.36</hutool-all.version><!-- **************************** 工具类 **************************** --></properties><!--锁定版本--><dependencyManagement><dependencies><!-- **************************** 分布式核心 **************************** --><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot-dependencies.version}</version><type>pom</type><scope>import</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud-dependencies.version}</version><type>pom</type><scope>import</scope></dependency><!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba-dependencies.version}</version><type>pom</type><scope>import</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId><version>${spring-cloud-starter-loadbalancer.version}</version></dependency><!-- 负载均衡-openfeign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>${spring-cloud-starter-openfeign.version}</version></dependency><!-- **************************** 分布式核心 **************************** --><!-- **************************** 数据库依赖 **************************** --><!-- MyBatis-Plus启动器,增强版MyBatis,提供更高效的操作和动态SQL能力 --><!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>${mybatis-plus-spring-boot3-starter.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus-generator.version}</version></dependency><!-- PostgreSQL的JDBC驱动 --><!-- https://mvnrepository.com/artifact/org.postgresql/postgresql --><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>${postgresql.version}</version></dependency><!-- Druid组件 --><!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-3-starter --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>${druid-spring-boot-3-starter.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper-spring-boot-starter.version}</version></dependency><!-- **************************** 数据库依赖 **************************** --><!-- **************************** 工具类 **************************** --><!-- 一个用于在 Java Bean 之间转换的代码生成工具。--><!-- 官网:https://mapstruct.org/ --><!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version></dependency><!--         commons-lang3:  通用的、可复用的 Java 组件,已其他包引入--><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><!--(Map、List、Set集合全覆盖)集合开发工具--><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>${commons-collections4.version}</version></dependency><!-- Java增强器,像Java Next版本--><!-- 集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等--><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>${guava.version}</version></dependency><!-- Java必备工具库 --><!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool-all.version}</version></dependency><!-- JSON序列化和反序列化 :已由别的包引入--><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --><!-- **************************** 工具类 **************************** --></dependencies></dependencyManagement><build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><addResources>true</addResources></configuration></plugin></plugins></pluginManagement></build>
</project>

online-edu-order-service/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.online_edu</groupId><artifactId>online-edu</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>online-edu-order-service</artifactId><dependencies><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.online_edu</groupId><artifactId>online-edu-common</artifactId><version>1.0-SNAPSHOT</version></dependency><!--        <dependency>--><!--            <groupId>com.alibaba.cloud</groupId>--><!--            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>--><!--        </dependency>--><!-- 添加nacos客户端——服务注册 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId></dependency><!-- PostgreSQL的JDBC驱动 --><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId></dependency></dependencies>
</project>

online-edu-order-service/src/main/resources/application.yml

server:port: 8000spring:application:name: online-edu-order-servicecloud:nacos:discovery:server-addr: xxx.xxx.xxx.xxx:8848username: nacospassword: xxxx8848datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:postgresql://localhost:5432/online_edu?currentSchema=video_orderusername: postgrespassword: 123456driver-class-name: org.postgresql.Driverdruid:# 数据库# 连接池-初始化大小initial-size: 10# 连接池-最大连接数max-active: 100# 最大等待时间max-wait: 60000# 连接池-最小空闲数min-idle: 10# 检测空闲连接test-while-idle: true# 最小空闲时间min-evictable-idle-time-millis: 300000
mybatis-plus:# Mapper XML文件路径mapper-locations: classpath:/mapper/**/*.xml# 实体类别名包路径type-aliases-package: org.online_edu.domainconfiguration:# MyBatis底层日志实现# 控制台输出sql、下划线转驼峰log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true# PageHelper分页插件
pagehelper:# 数据库类型helperDialect: postgresql# 是否合理处理count查询reasonable: true# 支持通过Map传入分页参数supportMethodsArguments: true# 自定义参数params: count=countSql

online-edu-order-service/src/main/java/org/online_edu/OrderApplication.java


package org.online_edu;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/*** @Author: bobokaka* @Date: 2024-08-23 00:18:14* @LastEditors: bobokaka* @Description: desc**/
@SpringBootApplication()
@MapperScan("org.online_edu.dao")
@EnableDiscoveryClient
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Beanpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}

运行,没问题。


image.png

其他几个服务一样配置。


image.png

服务相互调用——视频订单调用视频。

@RestController
@RequestMapping("/api/v1/video_order")
public class VideoOrderController {/*** 服务对象*/@Autowiredprivate VideoOrderService videoOrderService;@Autowiredprivate RestTemplate restTemplate;@RequestMapping("save")public Object save(@RequestParam(name="videoId") int videoId) {Video video = restTemplate.getForObject("http://localhost:9000/api/v1/video/find_by_id?videoId=" + videoId, Video.class);VideoOrder videoOrder = new VideoOrder();if (video != null) {videoOrder.setVideoId(video.getId());videoOrder.setVideoTitle(video.getTitle());videoOrder.setCreateTime(new Date());}return videoOrder;}}

改成

@RestController
@RequestMapping("/api/v1/video_order")
public class VideoOrderController {/*** 服务对象*/@Autowiredprivate VideoOrderService videoOrderService;@Autowiredprivate RestTemplate restTemplate;/*** 可以拉到注册服务的列表*/@Autowiredprivate DiscoveryClient discoveryClient;@RequestMapping("save")public Object save(@RequestParam(name = "videoId") int videoId) {
//        Video video = restTemplate.getForObject(
//                "http://localhost:9000/api/v1/video/find_by_id?videoId=" + videoId, Video.class);// 传入在nacos注册的服务名List<ServiceInstance> list = discoveryClient.getInstances("online-edu-video-service");ServiceInstance serviceInstance = list.get(0);Video video = restTemplate.getForObject("http://" + serviceInstance.getHost() +":"+serviceInstance.getPort()+ "/api/v1/video/find_by_id?videoId=" + videoId, Video.class);VideoOrder videoOrder = new VideoOrder();if (video != null) {videoOrder.setVideoId(video.getId());videoOrder.setVideoTitle(video.getTitle());videoOrder.setCreateTime(new Date());}return videoOrder;}}

浏览器打开http://localhost:8000/api/v1/video_order/save?videoId=40:
断点:

image.png

image.png
image.png
最后编辑于:2025-06-05 21:07:05


喜欢的朋友记得点赞、收藏、关注哦!!!

相关文章:

  • 面向对象设计原则
  • 【论文解读】LLaMA-Berry: 将“refine”当作动作解决数学推理
  • MySQL 根据时间自动创建分区脚本
  • 数据库学习(七)——MySQL执行引擎
  • DeepSeek提示词指南:从基础到高阶的全面解析
  • LlamaRL 大规模分布式异步强化学习框架
  • Leetcode 3585. Find Weighted Median Node in Tree
  • 【python深度学习】Day 54 Inception网络及其思考
  • 基于C#部署YOLOv5目标检测模型核心技术深度解析
  • 如何让DeepSeek-R1-Distill-Qwen-32B支持Function calling
  • Hudi 与 Hive 集成
  • 阿里开源的MaskSearch:教AI学会“自己找答案”的魔法书
  • 域与对象的生命周期
  • WSL备份与还原
  • Python函数基础知识(2/3)
  • SAP顾问职位汇总(第24周)
  • IDA动态调试环境配置全流程
  • Arduino入门教程:6、计时与定时
  • [从0到1]环境准备--anaconda与pycharm的安装
  • NodeJS怎么通过集群提高NodeJS的性能
  • 文成做网站/网站关键词优化系统
  • 长春电商网站建设公司排名/宁波seo网络推广产品服务
  • 做网站具体流程/百度关键词规划师
  • 男科医院网站建设策略/关键词优化资讯
  • 简述网站推广方式/南宁百度seo排名价格
  • 荥阳网站建设/关键词优化哪家强