【springcloud】快速搭建一套分布式服务springcloudalibaba(一)

第一篇 基于nacos搭建一套springcloud分布式服务

项目所需 maven + nacos + java8 + idea + git
当前项目为快速搭建 用户服务提供查询,商品服务查询用户信息
请先准备好环境,可以直接clone下来项目去部署。

快速搭建一套分布式服务

项目结构

模拟实际场景创建分布式应用 各个服务是单一的module

java 复制代码
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 的作用

  1. 修改端口号 默认端口8848
  2. 上下文路径: 默认 /nacos
  3. Nacos 支持使用 MySQL 作为持久化存储 单机模式下,默认使用 Derby 数据库,数据存储在 ${NACOS_HOME}/data 目录下
  4. 集群配置 nacos支持集群部署 nacos.core.cluster.members
  5. 认证与安全 支持身份认证可以加入用户名和密码 默认无nacos.core.auth.enabled nacos.core.auth.server.identity
  6. 线程池配置 与 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

java 复制代码
Could not resolve placeholder 'user.age' in value "${user.age}"
问题二

如果提示下面这个报错,是因为springbootweb集成的脚手架里面有/user了,url冲突了,改个url就行。

java 复制代码
{ [/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在这个配置文件里面把下面这个配置加上

java 复制代码
spring.main.allow-circular-references=true

Spring Boot 2.6.0 及以上版本默认:false(禁用循环依赖)。

Spring Boot 2.6.0 以下版本默认:true(允许循环依赖)。

图内的三个是我调试的信息,可以结合自己跑起来的看看。

dataId 对应项目中的 spring.config.import

java 复制代码
user.name=测试
user.age=18

商品服务

用户服务启动之后 可以直接复制一套。
记得pom引入 ali-cloud-common 。
application.properties中的信息改成商品服务的信息。

调试

用户服务 通过id获取用户

商品服务 通过用户服务获取用户信息

商品服务获取用户信息一共有俩种方式 第一种是 @FeignClient("user-service") 注解方式

第二种是 restTemplate 集成的LoadBalanced 负载均衡请求。

俩者都是默认轮询负载。

启动信息

部署三台user-service服务提供给goods服务调用

服务启动了,试试调用 。我是在goods服务通过userId获取用户的信息。

java 复制代码
http://127.0.0.1:8090/goods/user/get?userId=1000

**根据控制台日志信息确实是轮训 且按轮询调用处理。 因为是三个实例就不贴图了

**

调试过程的问题与解决

问题一

NacosDiscoveryConsumerConfiguration 这个配置类在哪个包下面只会扫当前目录里面的包注解@FeignClient 。

把@EnableFeignClients 放到启动类中,就会扫整个目录了。

问题二

getUser2

get请求发送参数 在方法中必须 加入@RequestParam

post请求必须加入 @RequestBody

对应的@RequestHeader("Authorization") 发送请求头信息

@PathVariable("id") 获取路径中的参数

java 复制代码
@FeignClient("user-service")

    @GetMapping("/user/get2")
    Res<User> getUser2(@RequestParam("userId") Long userId);

总结

八股文:

分布式服务 是一种将应用程序的功能拆分为多个独立的服务,并将这些服务部署在不同的计算节点(服务器、虚拟机、容器等)上的架构模式。每个服务可以独立开发、部署和扩展,并通过网络进行通信和协作,共同完成应用程序的功能。

目前只实现了程序拆分俩个独立的服务,后面还需要实现统一网管路由,因为部署多个实例,需要有一个统一网关进入实例(配置登录认证)分布式锁,分布式事务等等。

nacos是真的好用,相当于集成了eurke + apollo / 服务注册发现 和 动态配置管理。自身也可以直接部署多个实例。

希望本文可以帮到你。

相关推荐
TSAI17 分钟前
Docker Swarm 集群部署 Eureka 服务注册中心:高可用微服务架构的基石
spring cloud·docker
ShaneD77119 分钟前
Redis 实战:从零手写分布式锁(误删问题与 Lua 脚本优化)
后端
我命由我1234519 分钟前
Python Flask 开发问题:ImportError: cannot import name ‘Markup‘ from ‘flask‘
开发语言·后端·python·学习·flask·学习方法·python3.11
無量22 分钟前
Java并发编程基础:从线程到锁
后端
小信啊啊34 分钟前
Go语言数组与切片的区别
开发语言·后端·golang
中国胖子风清扬35 分钟前
SpringAI和 Langchain4j等 AI 框架之间的差异和开发经验
java·数据库·人工智能·spring boot·spring cloud·ai·langchain
计算机学姐1 小时前
基于php的摄影网站系统
开发语言·vue.js·后端·mysql·php·phpstorm
Java水解1 小时前
【SpringBoot3】Spring Boot 3.0 集成 Mybatis Plus
spring boot·后端
whoops本尊1 小时前
Golang-Data race【AI总结版】
后端
墨守城规1 小时前
线程池用法及原理
后端