首页 > 编程知识 正文

spring cloud 事务,spring分布式事务实现

时间:2023-05-05 04:47:12 阅读:174818 作者:2830

什么是springcloudconfigspringcloudconfig? springcloud是一种用于在分布式系统中集中外部配置基础架构和微服务APP应用程序的支持,分为客户端和服务端个部分。

服务端又称分布式部署中心,是一个独立的微服务器APP应用,连接部署仓库,为客户端提供部署信息获取、信息加密/解密等访问接口。

另一方面,客户端在微服务器架构中的每个微服务器APP或基础设施上,通过指定的配置中心管理APP应用资源的业务相关配置内容,启动时从配置中心获取配置信息并加载。

一、快速启动1、构建配置中心新建SpringBoot项目,命名为config-server; 添加依赖关系:

ependencygroupidorg.spring framework.cloud/groupidartifactidspring-cloud-config-server/artifact id/dependency主要用于

@ springbootapplication @ enableconfigserverpublicclassconfigserverapplication { publicstaticvoidmain { string [ ] args }

spring.application.name=config-server server.port=9000 #表示, 部署中心所在的仓库位置spring.cloud.config.server.git.uri=多个spring.cloud.config.server.git.search-paths=表示仓库位置

2、仓库配置规则配置信息的url与配置文件的映射关系如下:

//application }//{ profile } [//label } ]

/{application}-{profile}.yml或/{ application }-{ profile }.properties

/{ label }/{ application }-{ profile }.yml或/{ label }/{ application }-{ profile }.properties

3、客户端部署映射创建一个新的SpringBoot项目,命名为config-client,依赖:

ependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-web/artifact id/ependencydependend groupidartifactidspring-cloud-starter-config/artifact id/ddatifactid/dependency

创建bootstrap.properties文件以获取配置文件的config-server位置。必须在bootstrap.properties中

#设置服务名称spring.application.name=name#服务idserver.port=7002#对应文件规则的{profile} 部分spring.cloud.config.profile=teefile spring.cloud.config.label=config-label #配置中心地址spring.clabel

@ rest controller @ refreshscopepublicclasstestcontroller { @ value (“$ { from }”) private String from; @requestmapping(/from ) (public String from ) ) { return this.from; }@Autowiredprivate

Environment env;@RequestMapping("/from") public String from(){ return env.getProperty("from","undefined"); }} 二、服务端详解 1、基础架构

几个要素:
1、远程Git仓库;
2、Config Server;
3、本地Git仓库;
4、具体微服务应用;

客户端从配置管理中获取配置流程:

1、应用启动,根据bootstrap.properties中配置的应用名{application}、环境名{profile}、分支名{label},行配置中心获取配置信息。
2、ConfigServer根据自己维护的Git仓库信息和客户端传递过来的配置定位信息去查找配置信息。
3、通过git clone命令将找到的配置信息下载到ConfigServer的文件系统中。
4、ConfigServer创建Spring的ApplicationContext实例,并从git本地仓库中加载配置文件,最后将这些配置文件内容读取出来返回给客户端
5、客户端应用在获得外部配置文件后加载到客户端ApplicationContext实例,该配置内容的优先级高于客户端Jar包内部的配置内容,所以在Jar包中重复的内容将不再被加载。

2、仓库

可以使用Git和SVN仓库,推荐使用Git

3、加密解密

如果我们直接将敏感信息以明文的方式存储于微服务应用的配置文件中是非常危险的。针对这个问题,Spring Cloud Config提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。

spring.datasource.username=didispring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b

在属性值前使用{cipher}前缀来标注该内容是一个加密值,当微服务客户端来加载配置时,配置中心会自动的为带有{cipher}前缀的值进行解密。

使用前提
需要在配置中心的运行环境中安装不限长度的JCE版本(Unlimited Strength Java Cryptography Extension)。从Oracle的官方网站中下载。
下载后需要将local_policy.jar和US_export_policy.jar两个文件复制到$JAVA_HOME/jre/lib/security目录下,覆盖原来的默认内容。

相关端点
启动配置中心。在控制台中,将会输出了一些配置中心特有的端点,主要包括:

/encrypt/status:查看加密功能状态的端点
/key:查看密钥的端点
/encrypt:对请求的body内容进行加密的端点
/decrypt:对请求的body内容进行解密的端点

配置密钥
通过encrypt.key属性在配置文件中直接指定密钥信息(对称性密钥)
访问/encrypt和/decrypt端点来进行加密和解密的功能。注意,这两个端点都是POST请求,加密和解密信息需要通过请求体来发送。

非对称加密
Spring Cloud Config的配置中心不仅可以使用对称性加密,也可以使用非对称性加密(比如:RSA密钥对)。虽然非对称性加密的密钥生成与配置相对复杂一些,但是它具有更高的安全性。
通过keytool工具来生成密钥对,%JAVA_HOME%hxdhmkeytool.exe。
生成一个config-server.keystore文件。将它保存在配置中心的文件系统中的某个位置,比如放在当前的用户目录下,然后在配置中心中加入相关的配置信息:

encrypt.key-store.location=file://${user.home}/config-server.keystoreencrypt.key-store.alias=config-serverencrypt.key-store.password=111111encrypt.key-store.secret=222222

如果我们将config-server.keystore放在配置中心的src/main/resource目录下,也可以直接这样配置:encrypt.key-store.location=config-server.keystore。另外,非对称加密的配置信息也可以通过环境变量的方式进行配置,它们对应的具体变量名如下:

ENCRYPT_KEY_STORE_LOCATIONENCRYPT_KEY_STORE_ALIASENCRYPT_KEY_STORE_PASSWORDENCRYPT_KEY_STORE_SECRET

通过环境变量来配置密钥库相关信息可以获得更好的安全性。

4、高可用配置

传统作法:

服务模式:
把config-server也注册为服务,这样所有客户端就能以服务的方式进行访问。见下面服务化配置中心。

三、客户端详解 1、URI指定配置中心 spring.cloud.config.uri=http://localhost:7001/ 2、服务化配置中心

把config-server也注册为服务,这样所有客户端就能以服务的方式进行访问。通过这种方法,只需要启动多个指向同一Git仓库位置的config-server就能实现高可用了。

config-server配置:
在pom.xml的dependencies节点中引入依赖,相比之前的config-server就加入了spring-cloud-starter-eureka,用来注册服务。

在application.properties中配置参数eureka.client.serviceUrl.defaultZone以指定服务注册中心的位置

spring.application.name=config-serverserver.port=7001# 配置服务注册中心eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/# git仓库配置spring.cloud.config.server.git.uri=仓库地址spring.cloud.config.server.git.searchPaths=spring.cloud.config.server.git.username=usernamespring.cloud.config.server.git.password=password

在应用主类中,新增@EnableDiscoveryClient注解

config-client配置:
在pom.xml的dependencies节点中新增spring-cloud-starter-eureka依赖

在bootstrap.properties中,按如下配置:

spring.application.name=didispaceserver.port=7002eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/spring.cloud.config.discovery.enabled=truespring.cloud.config.discovery.serviceId=config-serverspring.cloud.config.profile=dev

在应用主类中,增加@EnableDiscoveryClient注解

沿用之前创建的Controller来加载Git中的配置信息

访问客户端应用提供的服务:http://localhost:7002/from,此时,我们会返回在Git仓库中properties文件配置的from属性内容

3、配置刷新

在config-client端增加一些内容和操作以实现配置的刷新:
在config-clinet的pom.xml中新增spring-boot-starter-actuator监控模块,其中包含了/refresh刷新API。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>

通过POST请求发送到http://localhost:7002/refresh,参数的配置内容被更新了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。