目录
前言
官方中文文档
使用版本
spring
中间件
使用到的组件与功能
环境安装
虚拟机
nexus
nacos
集成过程
工程搭建
父工程搭建
子工程
服务集成
nacos
配置文件:
服务注册与发现-discovery
服务注册
启动
服务发现
测试
配置管理-config
新增配置
测试
前言
只介绍如何集成及使用,概念性的东西就不细说了。慢慢更新
官方中文文档
spring-cloud-alibaba/README-zh.md at 2022.x · alibaba/spring-cloud-alibaba · GitHub
使用版本
spring
我这边使用的都是最新版
spring.cloud.alibaba.version | 2022.0.0.0-RC2 |
spring.cloud.version | 2022.0.0 |
spring.boot.version | 3.0.2 |
spring-cloud-alibaba、spring-cloud、springboot 三者的版本关系说明
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
中间件
nacos: 2.2.1
使用到的组件与功能
服务注册与发现:Nacos
分布式事务:Seata
网关:Spring Cloud Gateway
服务调用:OpenFeign
环境安装
虚拟机
我是用的VMware虚拟机里面跑的。
具体怎么装,看下面
(312条消息) VMware16安装 CentOS7_ricardo.M.Yu的博客-CSDN博客
nexus
我这边搭建了一个nexus maven私服
(310条消息) docker-compose 搭建maven私服 nexus与配置_ricardo.M.Yu的博客-CSDN博客
nacos
(310条消息) docker-compose安装nacos 2.2.1及配置_ricardo.M.Yu的博客-CSDN博客
集成过程
工程搭建
我这边使用的是springboot多模块项目,最终效果如下
父工程搭建
POM文件
<?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.example</groupId>
<artifactId>cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>file</module>
<module>auth</module>
<module>gateway</module>
<module>admin</module>
<module>data</module>
<module>biz</module>
<module>log</module>
<module>consumer</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.cloud.alibaba.version>2022.0.0.0-RC2</spring.cloud.alibaba.version>
<spring.cloud.version>2022.0.0</spring.cloud.version>
<spring.boot.version>3.0.2</spring.boot.version>
<spring.boot.admin.version>2.5.1</spring.boot.admin.version>
<lombok.version>1.18.20</lombok.version>
<fastjson.version>1.2.73</fastjson.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.2</version>
<relativePath/>
</parent>
<dependencyManagement>
<!-- cloud -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- admin -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>${spring.boot.admin.version}</version>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>${spring.boot.admin.version}</version>
</dependency>
<!-- 第三方工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--统一环境-->
<profiles>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
</profile>
</profiles>
<!--maven插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>none</mainClass> <!-- 取消查找本项目下的Main方法:为了解决Unable to find main class的问题 -->
<classifier>execute</classifier> <!-- 为了解决依赖模块找不到此模块中的类或属性 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
子工程
服务集成
nacos集成
部分可以参考官方的示例
Nacos Spring Cloud 快速开始
配置文件
这边我定义了4组配置文件,说一下他们的作用:
引导类配置;
bootstrap.yaml:定义当前生效的配置
spring:
profiles:
active: dev
bootstrap-dev.yaml:定义引导类当前生效的参数
spring:
cloud:
nacos:
server-addr: http://192.168.1.115:8108/
discovery:
group: dev
应用级配置:
application.yaml
应用级别的基础配置
logging:
level:
root: info
com:
sy: debug
application-dev.yaml
定义应用的名称以及端口等信息
server:
port: 9110
spring:
application:
name: biz
服务注册与发现-discovery
服务注册
引入依赖
<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>
启动
启动后,查看nacos控制台服务列表,已经能看到这个实例
服务发现
需要在新建一个consumer服务,来测试
分别在两个模块建两个controller, biz模块下:
@RestController
@RefreshScope
@RequestMapping("/")
public class BizController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
consumer模块下
@Slf4j
@RestController
@RequestMapping("/")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName() {
//使用 LoadBalanceClient 和 RestTemolate 结合的方式来访问
ServiceInstance serviceInstance = loadBalancerClient.choose("biz");
String url = String.format("http://%s:%s/echo/%s", serviceInstance.getHost(), serviceInstance.getPort(), appName);
System.out.println("request url:" + url);
String result = restTemplate.getForObject(url, String.class);
log.info("result -> {}", result);
return result;
}
}
测试
用consumer下的http测试接口,发现已经能正常返回数据,appName即为consumer
配置管理-config
配置管理测试,主要集成从nacos拉取公共配置并测试,
新增配置
biz模块下新增依赖和配置文件
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
增加配置中心config配置,文件扩展为yaml
spring:
cloud:
nacos:
server-addr: http://192.168.1.115:8108/
discovery:
group: dev
#配置中心
config:
server-addr: http://192.168.1.115:8108/
group: dev
file-extension: yaml
# 共享配置
# shared-configs:
# - data-id: application-dev.yaml
# group: dev
# extension-configs:
# - dataId: test01.yml
# group: dev
application:
name: biz
nacos web页面配置列表新增一个配置,命名格式和group要对,dataId格式
${spring.application.name}-${profile}.${file-extension:properties}
示例: biz-dev.yaml
我这边建了个示例
测试
修改 BizController 增加方法:
@Value("${username}")
private String username;
@GetMapping("/get")
public String get() {
return username;
}
http测试:可以看到username的值已经为 nacos的设置值