一. 简言
SpringCloud=分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶.基于对各种中间件的整合.具体中间件浩瀚繁多,迭代快.因此主要记录springCloud的整合逻辑,这个原因必须要保证boot和cloud这个大总管 版本兼容! 本篇文章运维部署采用docker,请先学习docker高级部分比较容易懂!
注意新版本有许多依赖需要独立导入,否则你将陷入深坑!如openfeigin需要独立导入spring-cloud-starter-loadbalancer.配置bootstrap文件需要导入spring-cloud-starter-bootstrap依赖等一系列问题,这都是摸爬滚打总结出来的经验教训呐
本篇采用截至目前的最新的官方稳定依赖套装
springboot 2.6.3
spring-cloud 2021.0.1
spring-cloud-alibaba 2021.1
版本一定要兼容.约定>配置>编码
springboot 和cloud的版本选择依赖 详情地址 详细的boot和cloud的版本选择依赖 详情地址
重要!
springCloudAlibaba统御各大中间件版本依赖关系 详情地址
springCloudAlibaba统御各大中间件版本依赖关系 详情地址
springCloudAlibaba统御各大中间件版本依赖关系 详情地址
约定>配置>编码
二. 基本环境配置
2.1 父工程pom文件
2.1.1编码配置
2.1.2 注解支持
2.1.3 java编译版本
2.1.4 maven导入配置
2021.4 父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>com.vector.springcloud</groupId>
<artifactId>cloud2021</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>cloud-provider-payment8001</module>
<module>cloud-consumer-order80</module>
<module>cloud-api-commons</module>
</modules>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.13.1</junit.version>
<slf4j.version>2.0.0-alpha5</slf4j.version>
<lombok.version>1.18.22</lombok.version>
<mysql.version>8.0.26</mysql.version>
<druid.version>1.2.9</druid.version>
<mybatis.spring.boot.version>2.2.2</mybatis.spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
三. 微服务模块业务流程–微服务模块之间调用
约定>配置>编码
3.1 支付模块样例
3.1.1 父工程下建maven子模块
3.1.2 建yml
3.1.3. 建启动类
3.1.4 业务类
- 建module
- 改pom
- 写yml
- 主启动
- 业务类 …
同理创建 消费者模块
3.2 工程聚合-继承-重构
模块继承,功能聚合.重构抽离重复实体. 下图存在重复实体
api-commons模块抽离公共代码
五.支配主流中间件
5.1 nacos注册中心
作用:跨服务器实现功能模块之间的数据通信. nacos注册中心与配置中心 <=> Eureka +Config + Bus
nacos下载地址
5.1.1 docker下载与启动nacos客户端
默认账号密码; nacos nacos
5.1.2 引pom依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<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-bootstrap</artifactId>
</dependency>
5.1.3 配置yml连接
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: '*'
- 主启动类写标签
5.2 nacos配置中心
作用:配置文件与jar发布部署相分离.可以通过nacos实时修改项目配置源.而不需要重新部署项目
- 建module
- 改pom
- 建yml
- 主启动
- 业务类
5.2.1 pom主要配置依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<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-bootstrap</artifactId>
</dependency>
springboot2.4修改了bootstrap文件引导方式,必须引入该依赖.否则naocs主动类起不来,也访问不到配置路径!!!
5.2.2 yml (springboot中配置文件的加载是存在优先级顺序的,优先级nacos高于bootstrap高于application )
bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: DEFAULT_GROUP
application.yml
spring:
profiles:
active: dev
务必版本对应,查询地址
data id的配置文件名应当严格遵守官方文档规范!配置文件后缀必须与data id名称一致
5.2.3 主启动
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
5.2.4 调接口获取配置http://localhost:3377/config/info
5.3 命名空间,分组和DataID的关系
默认情况:
- Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAULT
- Nacos默认的命名空间是public,Namespace主要用来实现隔离。(开发、测试、生产环境)
- Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去.
- Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT
- Cluster是对指定微服务的一个虚拟划分。
- Instance,就是微服务的实例
六 nacos集群配置及持久化操作
作用: 预防一台nacos挂机造成整个项目瘫痪.(至少3台) 默认Nacos使用嵌入式数据库derby实现数据的存储。但如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
轻量练习运行方式
sudo docker run \
--name nacos -d \
-p 8848:8848 \
--privileged=true \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
--restart=always \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
nacos/nacos-server:1.4.2
docker单机部署nacos详见这位博主
nacos集群配置
七 openFeign服务调用
实质上封装了new RestTemplate()
它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡
-
接口+注解(微服务调用接口+@FeignClient) -
引入pom
<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>
<version>3.1.2</version>
</dependency>
- yml
- 主启动类 激活 @EnableFeignClients
- 业务类
详细使用请看官网
八. sentinel
简介 官网地址
java -jar sentinel-dashboard-1.8.3.jar 前台启动 localhost:8080 账号密码均为:sentinel
1.pom
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<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>
<version>3.1.2</version>
</dependency>
2.yml
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719
management:
endpoints:
web:
exposure:
include: '*'
- 主启动
@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401
{
public static void main(String[] args) {
SpringApplication.run(MainApp8401.class, args);
}
}
- 业务类
@RestController
public class FlowLimitController
{
@GetMapping("/testA")
public String testA()
{
return "------testA";
}
@GetMapping("/testB")
public String testB()
{
return "------testB";
}
}
8.1 流控
qps并发量控制.御敌于门外 线程数控制.关门打狗.
8.2 熔断降级
降级规则
Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。 当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
8.3 热点key和系统规则
热点key官网
系统规则
九.gateway新一代网关
gateway地址
Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。 Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等
gateway模型: SpringCloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架
Spring Cloud Gateway 具有如下特性:
- 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建;
- 动态路由:能够匹配任何请求属性;
- 可以对路由指定 Predicate(断言)和 Filter(过滤器);
- 集成Hystrix的断路器功能;
- 集成 Spring Cloud 服务发现功能;
- 易于编写的 Predicate(断言)和 Filter(过滤器);
- 请求限流功能;
- 支持路径重写。
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
yml
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
nacos:
discovery:
server-addr
sentinel:
transport:
dashboard:
port: 8719
gateway:
discovery:
locator:
enabled: true
routes:
- id: payment_routh
uri: lb://cloud-payment-service
predicates:
- Path=/payment/get/**
- id: payment_routh2
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/**
上述配置相当于在8001模块的端口,套一层9527网关.经网关路由匹配到8001.根据断言规则寻找对应接口
硬编码方式配置
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
return routeBuilder.routes()
.route("test1", r -> {
return r.host("*.somehost.org").and().path("/somepath")
.filters(f -> f.addRequestHeader("header1", "header-value-1"))
.uri("http://someuri")
.metadata(RESPONSE_TIMEOUT_ATTR, 200)
.metadata(CONNECT_TIMEOUT_ATTR, 200);
})
.build();
}
|