【Spring】Spring Cloud Alibaba 版本选择及项目搭建笔记
文章目录
- 前言
- 1. 版本选择
- 2. 集成 Nacos
- 3. 服务间调用
- 4. 集成 Sentinel
- 5. 测试
- 后记
前言
最近重新接触了 Spring Cloud 项目,为此参考多篇官方文档重新搭建一次项目,主要实践:
- 版本选择,包括 Spring Cloud Alibaba、Spring Cloud、Spring Boot
- 项目集成 Nacos
- 项目使用 Nacos + Feign + Loadbalancer 完成服务间调用
- 项目集成 Sentinel
跟着文档实践后,重点理解:
- 版本选择
- 组件间的融合特点
项目Github
1. 版本选择
要了解版本怎么选,必然要搞清楚 Spring Cloud Alibaba、Spring Cloud、Spring Boot 这三者的关系:
- Spring Boot 官网描述 , 特点是快速建立 Spring 单体应用。
- Spring Cloud 官网描述 ,特点是帮助单体应用向微服务过度。(定义组件抽象)
- Spring Cloud Alibaba 官网描述 ,特点是贡献大厂的微服务组件。(定义组件实现)
填空题:
<dependencyManagement>
<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>
</dependencies>
</dependencyManagement>
首先,参考 Spring Cloud Alibaba 版本说明,受限于jdk版本,我们选 Spring Cloud Alibaba 2021.0.5
,关联的Cloud版本为 2021.0.5.0
。然后,参考 Spring Cloud 版本说明,关联的 Boot 版本 2.6.13
<properties>
<spring-boot.version>2.6.13</spring-boot.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>
2. 集成 Nacos
参考 Nacos 官网
- 准备中间件的服务端本质就是下载一个 release 包,部署到服务器上,能上控制台。跟后续的 Sentinel 思路一致。这里省略。
实现:
- 引入starter
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
- 装配(用的是Spring Cloud的注解,体现出生态融合的特点)
@EnableDiscoveryClient
@SpringBootApplication
public class SoupMilkApplication {
public static void main(String[] args) {
SpringApplication.run(SoupMilkApplication.class, args);
}
}
- 元数据支持
spring.application.name=nacos-milk-service
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=192.168.1.10:8848
spring.cloud.nacos.discovery.namespace=public
3. 服务间调用
普通的 Feign只是简化外部调用,真正配合nacos注册中心使用的话还需要一个负载均衡的依赖。
实现:
- 引入starter
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
- 装配
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class SoupMilkApplication {
public static void main(String[] args) {
SpringApplication.run(SoupMilkApplication.class, args);
}
}
- feign 关联 nacos 服务
@FeignClient("nacos-water-service")
public interface WaterClient {
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
String echo(@PathVariable("str") String str);
}
4. 集成 Sentinel
参考 Sentinel官网 ,附上一个控制台启动命令
java -Dserver.port=9090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
踩了一个端口的坑,需要开放以下端口,才能上报资源情况(指定为被Sentinel保护的资源)
firewall-cmd --zone=public --add-port=8719/tcp --permanent
firewall-cmd --reload
- 引入 starter
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 使用
@Service
public class TestService {
@SentinelResource(value = "hello")
public String sayHello(String name) {
return "Hello, " + name;
}
}
- 元数据
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard=192.168.1.10:9090
5. 测试
- nacos 控制台(账号密码都为sentinel) http://192.168.1.10:8848/nacos/#/login
- sentinel 控制台(账号密码都为sentinel)http://192.168.1.10:9090/
- 测试url http://localhost:8080/echo/sss
调用测试url后,既可以在 sentinel 看到记录。配置限流策略也可以生效。
后记
Spring Cloud Alibaba
两个组件的接入方式都很相似,也很好理解。其中值得一提的是:
- 在不改变
Spring Cloud
原生注解的情况下,完成了微服务组件的融合。(nacos注册中心)
@EnableDiscoveryClient
@SpringBootApplication
public class SoupMilkApplication {
public static void main(String[] args) {
SpringApplication.run(SoupMilkApplication.class, args);
}
}
- 在不改变
Feign
注解的情况下,完成了微服务组件的融合。(nacos微服务调用)
@FeignClient("nacos-water-service")
public interface WaterClient {
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
String echo(@PathVariable("str") String str);
}