【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 / 服务注册发现 和 动态配置管理。自身也可以直接部署多个实例。

希望本文可以帮到你。

相关推荐
m0_748248657 分钟前
SpringBoot整合easy-es
spring boot·后端·elasticsearch
一个热爱生活的普通人25 分钟前
golang的切片(Slice)底层实现解析
后端·go
红目香薰34 分钟前
Trae——慧码速造——完整项目开发体验
后端
web1508541593541 分钟前
超级详细Spring AI运用Ollama大模型
人工智能·windows·spring
Vcats2 小时前
深入浅出:基于SpringBoot和JWT的后端鉴权系统设计与实现
java·spring boot·后端
~kiss~2 小时前
Rust~二刷异步逻辑
开发语言·后端·rust
SomeB1oody2 小时前
【Rust中级教程】2.7. API设计原则之灵活性(flexible) Pt.3:借用 vs. 拥有、`Cow`类型、可失败和阻塞的析构函数及解决办法
开发语言·后端·性能优化·rust
LUCIAZZZ2 小时前
Https解决了Http的哪些问题
java·网络·网络协议·spring·http·rpc·https
larance2 小时前
Flask 发送邮件
后端·python·flask