springCloudAlibaba2021.0.1微服务环境搭建和支配主流中间件
文章目录一. 简言二.三.一. 简言SpringCloud=分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶.基于对各种中间件的整合.具体中间件浩瀚繁多,迭代快.因此主要记录springCloud的整合逻辑,这个原因必须要保证boot和cloud这个大总管版本兼容!springboot 和cloud的版本选择依赖 详情地址详细的boot和cloud的版本选择依赖
文章目录
一. 简言
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统御各大中间件版本依赖关系
详情地址
约定>配置>编码
二. 基本环境配置
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>
<!-- 统一管理jar包版本 -->
<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>
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<!-- dependencyManagement中只是声明依赖,而不实现引入。-->
<dependencyManagement>
<dependencies>
<!--spring boot 2.6.3-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<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>
三. 微服务模块业务流程–微服务模块之间调用
约定>配置>编码
- 建module
- 改pom
- 写yml
- 主启动
- 业务类
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注册中心
作用:发现服务模块,在naocs注册过的模块都可以被nacos管理.
nacos注册中心与配置中心 <=> Eureka +Config + Bus
5.1.1 docker下载与启动nacos客户端
# docker pull nacos/nacos-server:1.4.2
# docker run --name nacos-standalone -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.4.2
默认账号密码; nacos nacos
5.1.2 引pom依赖
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-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-bootstrap</artifactId>
</dependency>
5.1.3 配置yml连接
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
- 主启动类写标签
5.2 nacos配置中心
作用:配置文件与jar发布部署相分离.可以通过nacos实时修改项目配置源.而不需要重新部署项目
- 建module
- 改pom
- 建yml
- 主启动
- 业务类
5.2.1 pom主要配置依赖
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-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-bootstrap</artifactId>
</dependency>
springboot2.4修改了bootstrap文件引导方式,必须引入该依赖.否则naocs主动类起不来,也访问不到配置路径!!!
5.2.2 yml (springboot中配置文件的加载是存在优先级顺序的,优先级nacos高于bootstrap高于application
)
bootstrap.yml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置 与nacos-ui界面一致
group: DEFAULT_GROUP # 与nacos-ui的分组一致
# namespace: 与nacos-ui 命名空间ID一致
# 默认寻找命名规则${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
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
七 openFeign服务调用
作用: 跨服务器实现功能模块之间的数据通信.
实质上封装了new RestTemplate()
它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡
-
接口+注解(微服务调用接口+@FeignClient)
-
引入pom
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.2</version>
</dependency>
- yml
- 主启动类 激活 @EnableFeignClients
- 业务类
使用openfeign的前提是必须在服务注册中心都注册
详细使用请看官网
八. 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>
<!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
<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:
#Nacos服务注册中心地址
server-addr: localhost:8848
sentinel:
transport:
#配置Sentinel dashboard地址
dashboard: localhost:8080
#默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
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和系统规则
九.gateway新一代网关
Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。
gateway模型: SpringCloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架
作用: 1) 监控动态路由到各个服务,从nacos注册中心中实施感知某一服务状态,路由到正确位置.
2) Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等
Spring Cloud Gateway 具有如下特性:
- 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建;
- 动态路由:能够匹配任何请求属性;
- 可以对路由指定 Predicate(断言)和 Filter(过滤器);
- 集成Hystrix的断路器功能;
- 集成 Spring Cloud 服务发现功能;
- 易于编写的 Predicate(断言)和 Filter(过滤器);
- 请求限流功能;
- 支持路径重写。
pom
<!--gateway-->
<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:
#Nacos服务注册中心地址
server-addr
sentinel:
transport:
#配置Sentinel dashboard地址
dashboard:
#默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
port: 8719
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
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();
}
十.Seata分布式事务
官方文档
一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题.
微服务架构以后,会存在多个数据源或数据库.订单库,库存库,电商库,消费者库等可能分机部署…这些库的交互需要保证数据一致性.
10.1 分布式事务处理过程
10.2 使用seata-server 1.4+
在官网下载jar后
seata1.4加入很多第三方存储库.剩下由你探索
启动seata-server服务后.在编码中使用
更多推荐
所有评论(0)