以下内容,不保证都对,如果有写错的地方,欢迎指导🤣
Spring Cloud Alibaba学习记录
什么是“spring-cloud-alibaba”
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
开整
Nacos
下载
下载地址
https://github.com/alibaba/nacos/releases
很慢,至少,我下载很慢
启动
windows:\nacos\bin\startup.cmd 双击
浏览器打开:http://localhost:8848/nacos
用户名密码默认 nacos/nacos
新建工程
新建一个Maven工程,只为留一个主要的pom.xml。多余的没啥用,删了它。
要注意版本搭配。
部分pom.xml如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<springframework-cloud.version>Hoxton.SR3</springframework-cloud.version>
<alibaba-cloud.version>2.2.1.RELEASE</alibaba-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<!--整合spring cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${springframework-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--整合spring cloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${alibaba-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--整合spring cloud alibaba nacos (版本号是跟着上面的spring cloud alibaba走的)-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--必须加,不加不注册-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 项目整合Nacos实现配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
注册提供者provider、消费者consumer
https://blog.csdn.net/weixin_41842236/article/details/104247101
Ribbon
https://blog.csdn.net/weixin_41842236/article/details/104348324
把之前请求的ip地址端口,替换为服务名。
Feign
https://blog.csdn.net/weixin_41842236/article/details/104463575
创建加@FeignClient的接口。
Feign请求超时问题
全局配置
下边代码中使用的 feign.client.config.default ,意思是所有服务都采用该配置
feign:
client:
config:
default:
connectTimeout: 5000 #单位毫秒
readTimeout: 5000 #单位毫秒
若只针对某一服务,将default换成自己的要设置的服务名
feign:
client:
config:
服务名:
connectTimeout: 5000 #单位毫秒
readTimeout: 5000 #单位毫秒
Sentinel
什么是Sentinel?
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
简单测试
pom.xml
<!--sentinel依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--/actuator/sentinel-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml(非必填,仅可测试一下接口)
management:
endpoints:
web:
exposure:
include: '*'
浏览器输入:http://localhost:7011/actuator/sentinel
返回一些基础信息,即为成功。
Sentinel控制台:sentinel-dashboard
下载地址
https://github.com/alibaba/Sentinel/releases
下载jar包之后启动,默认端口8080,默认用户密码都是 sentinel
如果想更改端口,在jar中的配置文件里,application.properties增加配置
server.port=7019
spring.cloud.sentinel.transport.dashboard=localhost:7019
application.yml 中添加如下配置,使服务和控制台整合
spring:
cloud:
sentinel:
transport:
# 指定sentinel控制台的地址
dashboard: localhost:8080
簇点链路中可以看到近期接收到的请求,可为其设置规则
流控规则
在后台对应的接口上添加注解
对这个注解的解释可以在这个文章中了解
https://my.oschina.net/didispace/blog/3067836
@SentinelResource("xxx")
设置成功后,簇点链路中即可看到“xxx”的资源名。
如果不设置,资源名会默认为url,也可以起到限制的作用。
@SentinelResource(value = "xxx", blockHandler = "exceptionHandler")
String blockHandler() default "";
//设置拦截处理,blockHandler 需在相同类之中,且方法名和返回类型相同,不然不生效。
Class<?>[] blockHandlerClass() default {};
//设置拦截处理,blockHandlerClass。返回类型,参数,一致,且都需要添加异常类
//并且方法的修饰符必须是public static
@SentinelResource(value = "xxx", blockHandlerClass = SentinelBlockHandler.class, blockHandler = "exceptionHandler")
设置规则
直接模式:QPS达到设置的阈值,直接拦截。
关联模式:关联的QPS达到阈值时,也拦截。举例:支付模块达到阈值,则限流订单模块。
链路模式:设置资源和入口资源,当被访问资源达到阈值,则开始限流。
如果当使用时发现,新增规则成功,但在流控规则页面并不能查询到新建的规则,可能是fastjson版本存在问题。并不是高版本就一定是好用的。
Sentinel 客户端版本 1.7.1 + fastjson 1.2.9 不可用。
Sentinel 客户端版本 1.7.1 + fastjson 1.2.62 可用。
当超过设置的阈值时,请求则不会顺利通过,后台抛出异常
Caused by: com.alibaba.csp.sentinel.slots.block.flow.FlowException: null
Feign 中使用 Sentinel
https://www.jiajitao.cn/detailAct/155229752111266
@FeignClient(name = “XX”, fallback = XXXfallback.class),在XXXfallback.clsss写异常处理返回。
消费者配置文件加↓
feign:
sentinel:
enabled: true
fallbackFactory,作用同fallback,算是fallback的加强版,可拦截异常处理。
示例,截取自阿里巴巴官方示例:sentinel-feign-consumer-example
@FeignClient(name = "service-provider",
fallbackFactory = EchoServiceFallbackFactory.class)
public interface EchoService {
/**
* 调用服务提供方的输出接口.
* @param str 用户输入
* @return echo result
*/
@GetMapping("/echo/{str}")
String echo(@PathVariable("str") String str);
}
public class EchoServiceFallback implements EchoService {
private Throwable throwable;
EchoServiceFallback(Throwable throwable) {
this.throwable = throwable;
}
/**
* 调用服务提供方的输出接口.
* @param str 用户输入
* @return
*/
@Override
public String echo(String str) {
return "consumer-fallback-default-str" + throwable.getMessage();
}
}
@Component
public class EchoServiceFallbackFactory implements FallbackFactory<EchoServiceFallback> {
@Override
public EchoServiceFallback create(Throwable throwable) {
return new EchoServiceFallback(throwable);
}
}
RocketMQ
https://blog.csdn.net/weixin_41842236/article/details/105316885
以上链接,application.properties中,namesrvAddr错误,正确写法:rocketmq.config.namesrvAddr=127.0.0.1:9876
环境变量配置之后,若启动仍提示未配置环境变量,重启电脑。
主要启动步骤:
MQ文件夹\bin’下,然后执行‘start mqnamesrv.cmd’
MQ文件夹\bin’下,然后执行‘start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true’
rocketmq-externals\rocketmq-console\target,执行‘java -jar rocketmq-console-ng-1.0.1.jar’
浏览器打开:http://localhost:8888
阿里云帮助文档
https://help.aliyun.com/product/29530.html?spm=a2c4g.11186623.6.540.75ac7c33Zi3Jr5
样例 RocketMQ_Example.md
https://github.com/apache/rocketmq/blob/master/docs/cn/RocketMQ_Example.md
注:
主题Topic在RocketMQ控制台创建,代理者位点=消费者位点,消息被消费。
消费者中无论Tag是否相同,都会被消费,只是不同的会被过滤掉(CONSUMED_BUT_FILTERED ),相同就消费(CONSUMED)并实现接口(MessageListenerConcurrently)方法(consumeMessage)。
异步消息设置延时
//messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
//level=0 级表示不延时,level=1 表示 1 级延时,level=2 表示 2 级延时,以此类推。
msg.setDelayTimeLevel(1);
广播消息
在两个监听类,添加相同的topic名称,并设置消息类型是广播模式(messageModel = MessageModel.BROADCASTING),即可两个消费者同时收到消息。
@RocketMQMessageListener(consumerGroup = “a”, topic = “123”, messageModel = MessageModel.BROADCASTING)
@RocketMQMessageListener(consumerGroup = “b”, topic = “123”, messageModel = MessageModel.BROADCASTING)
事务消息
事务消息共有三种状态,提交状态、回滚状态、中间状态:
TransactionStatus.CommitTransaction: 提交事务,它允许消费者消费此消息。
TransactionStatus.RollbackTransaction: 回滚事务,它代表该消息将被删除,不允许被消费。
TransactionStatus.Unknown: 中间状态,它代表需要检查消息队列来确定状态。
实现TransactionListener接口,其中包含executeLocalTransaction、checkLocalTransaction。
executeLocalTransaction 方法来执行本地事务。它返回三个事务状态之一。
checkLocalTransaction 方法用于检查本地事务状态,并回应消息队列的检查请求。它也是返回三个事务状态之一。
如果是Unknown中间状态,checkLocalTransaction默认将单个消息的检查次数限制为 15 次,但是用户可以通过 Broker 配置文件的 transactionCheckMax参数来修改此限制。
参考示例
https://blog.csdn.net/weixin_43558566/article/details/103479522?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
https://blog.csdn.net/hosaos/article/details/90050276?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
SpringBoot简单整合RocketMQ
https://www.cnblogs.com/fx-blog/p/11737658.html
配置文件中,如果不加rocketmq的配置,RocketMQTemplate无法注入,会启动报错。
如何发送事务消息?
在客户端,首先用户需要实现RocketMQLocalTransactionListener接口,并在接口类上注解声明 @RocketMQTransactionListener。
实现确认和回查方法;然后再使用资源模板 RocketMQTemplate, 调用方法sendMessageInTransaction()来进行消息的发布。
注意:从 RocketMQ-Spring 2.1.0版本之后,注解@RocketMQTransactionListener不能设置 txProducerGroup、ak、sk,这些值均与对应的RocketMQTemplate保持一致。同样,sendMessageInTransaction中,也不再需要txProducerGroup的参数。
Seata
官方介绍
http://seata.io/zh-cn/index.html
Spring Cloud 使用 Seata 实现分布式事务,Nacos 作为 Seata 配置中心
参考资料
https://github.com/helloworlde/spring-cloud-alibaba-component/tree/master/cloud-seata-nacoshttps://lucifer.blog.csdn.net/article/details/103488402
https://blog.csdn.net/weixin_46123910/article/details/106748873
以上资料对于在application.yml配置seata的pom文件是错误的。官方示例
https://github.com/seata/seata-samples/tree/master/nacos
下载server压缩包
https://github.com/seata/seata/releases
修改 conf/registry.conf 配置,将 type 改为 nacos
registry {
type = "nacos"
nacos {
serverAddr = "localhost"
namespace = ""
cluster = "default"
}
}
config {
type = "nacos"
nacos {
serverAddr = "localhost"
namespace = ""
cluster = "default"
}
}
将 Seata 配置添加到 Nacos 中
在1.2.0版本中,conf不包含以下文件,需手动寻找(烦) :
(1)nacos-config.sh
https://github.com/seata/seata/blob/1.2.0/script/config-center/nacos/nacos-config.sh
(2)config.txt
https://github.com/seata/seata/blob/1.2.0/script/config-center/config.txt
要在config.txt中,加入服务的信息
service.vgroupMapping.xxx-server-group=default
cd seata/conf
sh nacos-config.sh localhost
sh 命令可用“git-bash.exe”执行
成功后会提示
init nacos config finished, please start seata-server
启动 Seata Server
进入seata/bin
cd …
sh ./bin/seata-server.sh
或
进入bin 双击 seata-server.bat 启动seata
Pom文件中添加,上文资料中,错误的配置文件修改如下
<!-- seata-->
<!-- 需添加registry.conf-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-alibaba-seata</artifactId>-->
<!-- <version>2.1.0.RELEASE</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.seata</groupId>-->
<!-- <artifactId>seata-all</artifactId>-->
<!-- <version>1.1.0</version>-->
<!-- </dependency>-->
<!-- 不需要registry.conf,写在配置文件中-->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.2.0</version>
<exclusions>
<exclusion>
<artifactId>seata-all</artifactId>
<groupId>io.seata</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>1.2.0</version>
</dependency>
配置文件如下
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: ${spring.application.name}-group
enable-auto-data-source-proxy: true
config:
type: nacos
nacos:
namespace:
serverAddr: 127.0.0.1:8848
group: SEATA_GROUP
userName: "nacos"
password: "nacos"
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
namespace:
userName: "nacos"
logging:
level:
io.seata: debug
Docker
安装,选择适用操作系统或云服务的Docker Community Edition框
https://hub.docker.com/search?type=edition&offering=community
在Docker中下载并运行Jenkins
建议使用的Docker映像是jenkinsci/blueocean image(来自 the Docker Hub repository)。 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 (可以投入使用) ,捆绑了所有Blue Ocean插件和功能。这意味着你不需要单独安装Blue Ocean插件。
cmd输入:
docker pull jenkinsci/blueocean
打开命令提示符窗口。
下载 jenkinsci/blueocean 镜像并使用以下 docker run 命令将其作为Docker中的容器运行 :
docker run ^
-u root ^
--rm ^
-d ^
-p 8080:8080 ^
-p 50000:50000 ^
-v jenkins-data:/var/jenkins_home ^
-v /var/run/docker.sock:/var/run/docker.sock ^
jenkinsci/blueocean
然后在docker中可见
浏览器输入http://localhost:8080/即可访问
密码在docker的控制台日志输出中,复制自动生成的字母数字密码(在两组星号之间)。
Jenkins
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行
官方网站
https://www.jenkins.io/zh/
下载
https://www.jenkins.io/zh/download/
下载挺慢,反正我是挺慢。
安装说明
https://www.jenkins.io/zh/doc/book/installing/
安装完成后会自动打开。
密码:Jenkins路径\secrets\initialAdminPassword
手动操作步骤:
windows: 服务中找到Jenkins,启动或停止
自动部署
Jenkins自动部署可能所需插件:
Maven Integration plugin
Subversion Plug-in(搜索时搜索到的名字是Subversion)
未完待续。。。