第一篇 基于nacos搭建一套springcloud分布式服务
项目所需 maven + nacos + java8 + idea + git
当前项目为快速搭建 用户服务提供查询,商品服务查询用户信息
请先准备好环境,可以直接clone下来项目去部署。
快速搭建一套分布式服务
- 项目结构
- 关于搭建
- 下载配置nacos
- 下载
- 解压与配置
- 快速搭建一套分布式服务
- commonUtil 服务
- 用户服务
- 创建项目
- 启动项目
- 问题一
- 问题二
- 问题三(重要)
- 问题四(脚手架循环依赖注入)
- 商品服务
- 调试
- 用户服务 通过id获取用户
- 商品服务 通过用户服务获取用户信息
- 启动信息
- 调试过程的问题与解决
- 问题一
- 问题二
- 总结
项目结构
模拟实际场景创建分布式应用 各个服务是单一的module
git clone git@gitee.com:goodluckv/ali-cloud-common.git
git clone git@gitee.com:goodluckv/ali-cloud-goods.git
git clone git@gitee.com:goodluckv/ali-cloud-user.git
关于搭建
下载配置nacos
下载
官网地址 nacos下载
楼主主要做演示用,直接下载的最新的稳定版本。2.5.0。如果没有了请在历史版本中查询。
解压与配置
解压后的目录
启动命令 sh /Users/***/nacos/bin/startup.sh -m standalone
nacos is starting with standalone
nacos is starting. you can check the /Users/***/nacos/logs/start.out
输入下面url 进入管理页面 如果成功进去即部署成功。2.5.0版本开发版本单机模式启动是开封即用的。
http://127.0.0.1:8848/nacos
如果想进一步了解可以 进入conf目录 查看application.properties
启动前请确保默认配置8848端口没有被占用
-m standalone 参数可以快速启动 Nacos 单机模式,适合开发和测试。
单机模式的特点
- 无需集群配置:单机模式下,Nacos 不会尝试与其他节点通信,适合本地开发或测试。
- 默认使用嵌入式数据库(Derby):单机模式下,Nacos 默认使用内置的 Derby 数据库存储数据。
- 快速启动:无需额外配置,适合快速验证功能。
配置文件application.properties 的作用
- 修改端口号 默认端口8848
- 上下文路径: 默认 /nacos
- Nacos 支持使用 MySQL 作为持久化存储 单机模式下,默认使用 Derby 数据库,数据存储在 ${NACOS_HOME}/data 目录下
- 集群配置 nacos支持集群部署 nacos.core.cluster.members
- 认证与安全 支持身份认证可以加入用户名和密码 默认无nacos.core.auth.enabled nacos.core.auth.server.identity
- 线程池配置 与 HTTP 请求超时配置
还有很多 就不一个一个写了。我们看下一步
快速搭建一套分布式服务
commonUtil 服务
用于定义接口通讯的返回值等参数 模拟开发场景 因为是快速部署我们先定义基础类即可. boot项目会帮我把目录建好,我就直接选boot项目了。next选工具包时选择开发工具包中的Lombok 即可。
创建完成后 把目录修改一下 pom文件不需要的东西清除 。
pom中 加入下方的plugin打包 打包的地址 altDeploymentRepository,记得更改为自己的
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<configuration>
<altDeploymentRepository>local::default::file:///Users/***/software/javajre/localjar</altDeploymentRepository>
</configuration>
</plugin>
用户服务
用于登录与获取用户信息
创建项目
需要选中的包
- discovery 用于注册nacos与服务发现。configuration 用于nacos的动态配置信息获取。
- web springWeb项目开发脚手架,快速搭建服务
- openFeign 用于简化微服务之间的 远程调用。可以直接使用注解调用二方远程服务
- loadbalancer 用于负载均衡 默认启用 按顺序依次选择服务实例 还可以随机 权重 自定义 (Ribbon 官方已经不推荐使用了)
创建完之后的目录 。因为springcloud是给我提供的分布式脚手架,也基本做到了开封即用,所以项目创建之后直接是配置好的。
标注的几个地方需要改成自己的。
spring.application.name 会作为服务的唯一标识用于注册服务或者发现服务。
pom 别忘了加入自己的common包
<dependency>
<groupId>com.alicloud.common</groupId>
<artifactId>ali-cloud-common</artifactId>
<version>250223.002</version>
</dependency>
启动项目
问题一
做完上面那些就可以启动项目了。脚手架第一次启动会报错
原因: 我们导入了configuration 脚手架会自动注入 动态配置管理供我们参考,但我们的nacos中没有user.age信息 所以报错 ,这个时候进入本地nacos管理平台 加入配置即可。
配置中心的dataId 对应项目application.properties的 spring.config.import
http://127.0.0.1:8848/nacos
Could not resolve placeholder 'user.age' in value "${user.age}"
问题二
如果提示下面这个报错,是因为springbootweb集成的脚手架里面有/user了,url冲突了,改个url就行。
{ [/user]}: There is already 'nacosConfigSampleController' bean method
问题三(重要)
类 NacosConfigDemoConfiguration 中的dataId = “nacos-config-example.properties”; 记得修改成这个。具体为啥会是nacos-config-sample.properties可能是想让我们体验排查到问题的开心
问题四(脚手架循环依赖注入)
BrokerThe dependencies of some of the beans in the application context form a cycle:
脚手架再给我们演示负载均衡时触发了循环依赖注入了RestTemplateController
application.properties在这个配置文件里面把下面这个配置加上
spring.main.allow-circular-references=true
Spring Boot 2.6.0 及以上版本默认:false(禁用循环依赖)。
Spring Boot 2.6.0 以下版本默认:true(允许循环依赖)。
图内的三个是我调试的信息,可以结合自己跑起来的看看。
dataId 对应项目中的 spring.config.import
user.name=测试
user.age=18
商品服务
用户服务启动之后 可以直接复制一套。
记得pom引入 ali-cloud-common 。
application.properties中的信息改成商品服务的信息。
调试
用户服务 通过id获取用户
商品服务 通过用户服务获取用户信息
商品服务获取用户信息一共有俩种方式 第一种是 @FeignClient(“user-service”) 注解方式
第二种是 restTemplate 集成的LoadBalanced 负载均衡请求。
俩者都是默认轮询负载。
启动信息
部署三台user-service服务提供给goods服务调用
服务启动了,试试调用 。我是在goods服务通过userId获取用户的信息。
http://127.0.0.1:8090/goods/user/get?userId=1000
**根据控制台日志信息确实是轮训 且按轮询调用处理。 因为是三个实例就不贴图了
**
调试过程的问题与解决
问题一
NacosDiscoveryConsumerConfiguration 这个配置类在哪个包下面只会扫当前目录里面的包注解@FeignClient 。
把@EnableFeignClients 放到启动类中,就会扫整个目录了。
问题二
getUser2
get请求发送参数 在方法中必须 加入@RequestParam
post请求必须加入 @RequestBody
对应的@RequestHeader(“Authorization”) 发送请求头信息
@PathVariable(“id”) 获取路径中的参数
@FeignClient("user-service")
@GetMapping("/user/get2")
Res<User> getUser2(@RequestParam("userId") Long userId);
总结
八股文:
分布式服务 是一种将应用程序的功能拆分为多个独立的服务,并将这些服务部署在不同的计算节点(服务器、虚拟机、容器等)上的架构模式。每个服务可以独立开发、部署和扩展,并通过网络进行通信和协作,共同完成应用程序的功能。
目前只实现了程序拆分俩个独立的服务,后面还需要实现统一网管路由,因为部署多个实例,需要有一个统一网关进入实例(配置登录认证)分布式锁,分布式事务等等。
nacos是真的好用,相当于集成了eurke + apollo / 服务注册发现 和 动态配置管理。自身也可以直接部署多个实例。
希望本文可以帮到你。