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-nacos

https://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”执行
执行sh命令

成功后会提示
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
打开命令提示符窗口。
下载 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)

未完待续。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值