基于springboot2.0.6版本的TX-LCN分布式事务搭建说明
最近在搭建TX-LCN分布式事務時遇到不少坑,為了這些坑浪費了很長時間,為了別的小伙伴不在和我似的在這些坑上遇到相同的麻煩特把我的搭建過程整理出來,給大家參考
官方說明:http://www.txlcn.org/zh-cn/docs/demo/env.html
前期準備工作:
Mysql數(shù)據(jù)庫、Redis緩存、Eureka注冊服務。
一、首先我們要先搭建TX-LCN的服務端。即官網(wǎng)上說的tx-manager模塊。
1、新建SpringBoot項目
截止到發(fā)文前springboot官網(wǎng)版本是2.1.5,因此創(chuàng)建完成后,需要修改版本信息,降低版本號。TX-LCN項目中已經(jīng)集成了redis和數(shù)據(jù)庫連接,因此這里不需要加入數(shù)據(jù)庫和redis相關的依賴。只加入eureka 客戶端的依賴即可。
2、修改pom.xml文件,修改版本號信息及,增加相關的依賴信息,如圖:
生成的pom.xml文件內(nèi)容如下:
<?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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><groupId>com.manager</groupId><artifactId>tc-manager</artifactId><version>0.0.1-SNAPSHOT</version><name>tc-manager</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Finchley.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.codingapi.txlcn</groupId><artifactId>txlcn-tm</artifactId><version>5.0.2.RELEASE</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>3、修改application.properties文件,增加tm相關的配置信息,如redis和數(shù)據(jù)庫等。
注意:tx-lcn.manager.port=8070 這個配置,它用于配置LCN的監(jiān)聽端口,我們在下面配置客戶端服務里需要用到這個端口號。
server.port=7970spring.application.name=TransactionManagereureka.client.service-url.defaultZone=http://admin:admin@localhost:8761/eureka eureka.instance.appname=transaction-manager eureka.instance.prefer-ip-address=true#JDBC 數(shù)據(jù)庫配置 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://10.115.132.12:3306/tx?characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=123456#數(shù)據(jù)庫方言 spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect# 第一次運行可以設置為: create, 為TM創(chuàng)建持久化數(shù)據(jù)庫表 #spring.jpa.hibernate.ddl-auto=validate spring.jpa.hibernate.ddl-auto=update# TM監(jiān)聽IP. 默認為 127.0.0.1 tx-lcn.manager.host=127.0.0.1# TM監(jiān)聽Socket端口. 默認為 ${server.port} - 100 tx-lcn.manager.port=8070# 心跳檢測時間(ms). 默認為 300000 tx-lcn.manager.heart-time=300000# 分布式事務執(zhí)行總時間(ms). 默認為36000 tx-lcn.manager.dtx-time=8000# 參數(shù)延遲刪除時間單位ms 默認為dtx-time值 tx-lcn.message.netty.attr-delay-time=${tx-lcn.manager.dtx-time}# 事務處理并發(fā)等級. 默認為機器邏輯核心數(shù)5倍 tx-lcn.manager.concurrent-level=160# TM后臺登陸密碼,默認值為codingapi tx-lcn.manager.admin-key=codingapi# 分布式事務鎖超時時間 默認為-1,當-1時會用tx-lcn.manager.dtx-time的時間 tx-lcn.manager.dtx-lock-time=${tx-lcn.manager.dtx-time}# 雪花算法的sequence位長度,默認為12位. tx-lcn.manager.seq-len=12# 異常回調(diào)開關。開啟時請制定ex-url tx-lcn.manager.ex-url-enabled=false# 事務異常通知(任何http協(xié)議地址。未指定協(xié)議時,為TM提供內(nèi)置功能接口)。默認是郵件通知 tx-lcn.manager.ex-url=/provider/email-to/***@**.com# 開啟日志,默認為false tx-lcn.logger.driver-class-name=${spring.datasource.driver-class-name} tx-lcn.logger.jdbc-url=${spring.datasource.url} tx-lcn.logger.username=${spring.datasource.username} tx-lcn.logger.password=${spring.datasource.password}# redis 的設置信息. 線上請用Redis Cluster spring.redis.host=10.115.132.12 spring.redis.port=6379 spring.redis.password=1234564、修改啟動文件,增加TX-LCN的注解@EnableTransactionManagerServer。代碼如下:
package com.manager;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import com.codingapi.txlcn.tm.config.EnableTransactionManagerServer;@SpringBootApplication @EnableDiscoveryClient @EnableTransactionManagerServer public class TcManagerApplication {public static void main(String[] args) {SpringApplication.run(TcManagerApplication.class, args);}}5、創(chuàng)建完成后就可以啟動服務了。控制臺出現(xiàn)如下信息表示TX-LCN的服務端搭建完成。
2019-06-09 18:18:30.544 INFO 14812 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2b662a77: startup date [Sun Jun 09 18:18:30 CST 2019]; root of context hierarchy 2019-06-09 18:18:30.716 INFO 14812 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 2019-06-09 18:18:30.737 INFO 14812 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'configurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$d2cfd437] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.0.6.RELEASE)2019-06-09 18:18:30.878 INFO 14812 --- [ main] com.manager.TcManagerApplication : No active profile set, falling back to default profiles: default 2019-06-09 18:18:30.878 INFO 14812 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@67b9b51a: startup date [Sun Jun 09 18:18:30 CST 2019]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@2b662a77 2019-06-09 18:18:31.347 INFO 14812 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! 2019-06-09 18:18:31.662 INFO 14812 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! 2019-06-09 18:18:31.678 INFO 14812 --- [ main] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.codingapi.txlcn.tm.support.db.jpa.TxExceptionRepository. 2019-06-09 18:18:31.806 INFO 14812 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'dataSource' with a different definition: replacing [Root bean: class [null]; scope=refresh; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=false; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] with [Root bean: class [org.springframework.aop.scope.ScopedProxyFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in BeanDefinition defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] 2019-06-09 18:18:31.958 INFO 14812 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=0df06d89-18ce-38e7-9c32-fa4e5efaeac5 2019-06-09 18:18:31.977 INFO 14812 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 2019-06-09 18:18:32.070 INFO 14812 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$b6b5d13a] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2019-06-09 18:18:32.105 INFO 14812 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$d2cfd437] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2019-06-09 18:18:32.491 INFO 14812 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 7970 (http) 2019-06-09 18:18:32.516 INFO 14812 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2019-06-09 18:18:32.516 INFO 14812 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.34 2019-06-09 18:18:32.524 INFO 14812 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jre1.8.0_201\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre1.8.0_201/bin/server;C:/Program Files/Java/jre1.8.0_201/bin;C:/Program Files/Java/jre1.8.0_201/lib/amd64;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\iCLS\;C:\Program Files\Intel\Intel(R) Management Engine Components\iCLS\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\TortoiseSVN\bin;C:\Users\lenovo\AppData\Local\Microsoft\WindowsApps;;E:\sts-3.9.0.RELEASE;;.] 2019-06-09 18:18:32.684 INFO 14812 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2019-06-09 18:18:32.684 INFO 14812 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1806 ms 2019-06-09 18:18:32.856 WARN 14812 --- [ost-startStop-1] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources. 2019-06-09 18:18:32.856 INFO 14812 --- [ost-startStop-1] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath. 2019-06-09 18:18:32.863 INFO 14812 --- [ost-startStop-1] c.netflix.config.DynamicPropertyFactory : DynamicPropertyFactory is initialized with configuration sources: com.netflix.config.ConcurrentCompositeConfiguration@521808b8 2019-06-09 18:18:34.071 INFO 14812 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2019-06-09 18:18:34.072 INFO 14812 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'webMvcMetricsFilter' to: [/*] 2019-06-09 18:18:34.072 INFO 14812 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2019-06-09 18:18:34.072 INFO 14812 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2019-06-09 18:18:34.072 INFO 14812 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2019-06-09 18:18:34.072 INFO 14812 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpTraceFilter' to: [/*] 2019-06-09 18:18:34.072 INFO 14812 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] 2019-06-09 18:18:34.157 INFO 14812 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2019-06-09 18:18:34.424 INFO 14812 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2019-06-09 18:18:34.471 INFO 14812 --- [ main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default' 2019-06-09 18:18:34.471 INFO 14812 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default...] 2019-06-09 18:18:34.549 INFO 14812 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {5.2.17.Final} 2019-06-09 18:18:34.549 INFO 14812 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found 2019-06-09 18:18:34.596 INFO 14812 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.0.1.Final} 2019-06-09 18:18:34.706 INFO 14812 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect 2019-06-09 18:18:35.368 INFO 14812 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2019-06-09 18:18:36.133 WARN 14812 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources. 2019-06-09 18:18:36.133 INFO 14812 --- [ main] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath. 2019-06-09 18:18:36.196 INFO 14812 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-06-09 18:18:36.289 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@67b9b51a: startup date [Sun Jun 09 18:18:30 CST 2019]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@2b662a77 2019-06-09 18:18:36.336 WARN 14812 --- [ main] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2019-06-09 18:18:36.367 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/provider/email-to/{email}],methods=[POST]}" onto public boolean com.codingapi.txlcn.tm.support.txex.provider.DefaultExUrlProvider.email(java.lang.String,com.codingapi.txlcn.tm.support.db.domain.TxException) 2019-06-09 18:18:36.367 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto public java.lang.String com.codingapi.txlcn.tm.support.restapi.RedirectController.index() 2019-06-09 18:18:36.383 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/login],methods=[POST]}" onto public com.codingapi.txlcn.tm.support.restapi.vo.Token com.codingapi.txlcn.tm.support.restapi.AdminController.login(java.lang.String) throws com.codingapi.txlcn.common.exception.TxManagerException 2019-06-09 18:18:36.387 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/logs/{page} || /admin/logs/{page}/{limit} || /admin/logs],methods=[GET]}" onto public com.codingapi.txlcn.tm.support.restapi.vo.TxLogList com.codingapi.txlcn.tm.support.restapi.AdminController.txLogList(java.lang.Integer,java.lang.Integer,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer) throws com.codingapi.txlcn.common.exception.TxManagerException 2019-06-09 18:18:36.387 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/tx-manager],methods=[GET]}" onto public com.codingapi.txlcn.tm.support.restapi.vo.TxManagerInfo com.codingapi.txlcn.tm.support.restapi.AdminController.getTxManagerInfo() 2019-06-09 18:18:36.387 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/app-mods/{page} || /admin/app-mods/{page}/{limit} || /admin/app-mods],methods=[GET]}" onto public com.codingapi.txlcn.tm.support.restapi.vo.ListAppMods com.codingapi.txlcn.tm.support.restapi.AdminController.listAppMods(java.lang.Integer,java.lang.Integer) 2019-06-09 18:18:36.387 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/exceptions/{page} || /admin/exceptions || /admin/exceptions/{page}/{limit}],methods=[GET]}" onto public com.codingapi.txlcn.tm.support.restapi.vo.ExceptionList com.codingapi.txlcn.tm.support.restapi.AdminController.exceptionList(java.lang.Integer,java.lang.Integer,java.lang.Integer,java.lang.Integer) 2019-06-09 18:18:36.387 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/exceptions],methods=[POST]}" onto public boolean com.codingapi.txlcn.tm.support.restapi.AdminController.deleteExceptions(com.codingapi.txlcn.tm.support.restapi.vo.DeleteExceptions) throws com.codingapi.txlcn.common.exception.TxManagerException 2019-06-09 18:18:36.387 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/logs],methods=[DELETE]}" onto public boolean com.codingapi.txlcn.tm.support.restapi.AdminController.deleteLogs(com.codingapi.txlcn.tm.support.restapi.vo.DeleteLogsReq) throws com.codingapi.txlcn.common.exception.TxManagerException 2019-06-09 18:18:36.387 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/tm-cluster],methods=[GET]}" onto public java.util.List<com.codingapi.txlcn.tm.cluster.TMProperties> com.codingapi.txlcn.tm.support.restapi.AdminController.tmList() throws com.codingapi.txlcn.common.exception.FastStorageException 2019-06-09 18:18:36.387 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/log/transaction-info],methods=[GET]}" onto public com.alibaba.fastjson.JSONObject com.codingapi.txlcn.tm.support.restapi.AdminController.transactionInfo(java.lang.String,java.lang.String) throws com.codingapi.txlcn.common.exception.TxManagerException 2019-06-09 18:18:36.388 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/admin/transaction-info],methods=[DELETE]}" onto public boolean com.codingapi.txlcn.tm.support.restapi.AdminController.deleteTransactionInfo(java.lang.String,java.lang.String,java.lang.String) throws com.codingapi.txlcn.common.exception.TxManagerException 2019-06-09 18:18:36.388 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/manager/refresh],methods=[POST]}" onto public boolean com.codingapi.txlcn.tm.support.restapi.TxManagerController.refresh(com.codingapi.txlcn.txmsg.params.NotifyConnectParams) throws com.codingapi.txlcn.txmsg.exception.RpcException 2019-06-09 18:18:36.388 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2019-06-09 18:18:36.388 INFO 14812 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2019-06-09 18:18:36.404 INFO 14812 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-06-09 18:18:36.404 INFO 14812 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2019-06-09 18:18:36.960 INFO 14812 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator' 2019-06-09 18:18:36.970 INFO 14812 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>) 2019-06-09 18:18:36.970 INFO 14812 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>) 2019-06-09 18:18:36.971 INFO 14812 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto protected java.util.Map<java.lang.String, java.util.Map<java.lang.String, org.springframework.boot.actuate.endpoint.web.Link>> org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping.links(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2019-06-09 18:18:37.008 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2019-06-09 18:18:37.009 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'logDbProperties' has been autodetected for JMX exposure 2019-06-09 18:18:37.010 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure 2019-06-09 18:18:37.018 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'environmentManager' has been autodetected for JMX exposure 2019-06-09 18:18:37.019 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'refreshScope' has been autodetected for JMX exposure 2019-06-09 18:18:37.020 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'configurationPropertiesRebinder' has been autodetected for JMX exposure 2019-06-09 18:18:37.023 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'environmentManager': registering with JMX server as MBean [org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager] 2019-06-09 18:18:37.029 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'refreshScope': registering with JMX server as MBean [org.springframework.cloud.context.scope.refresh:name=refreshScope,type=RefreshScope] 2019-06-09 18:18:37.037 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'logDbProperties': registering with JMX server as MBean [com.codingapi.txlcn.logger.db:name=logDbProperties,type=LogDbProperties] 2019-06-09 18:18:37.039 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located managed bean 'configurationPropertiesRebinder': registering with JMX server as MBean [org.springframework.cloud.context.properties:name=configurationPropertiesRebinder,context=67b9b51a,type=ConfigurationPropertiesRebinder] 2019-06-09 18:18:37.043 INFO 14812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource] 2019-06-09 18:18:37.048 INFO 14812 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0 2019-06-09 18:18:37.059 INFO 14812 --- [ main] o.s.c.n.eureka.InstanceInfoFactory : Setting initial instance status as: STARTING 2019-06-09 18:18:37.095 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Initializing Eureka in region us-east-1 2019-06-09 18:18:37.139 INFO 14812 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using JSON encoding codec LegacyJacksonJson 2019-06-09 18:18:37.140 INFO 14812 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using JSON decoding codec LegacyJacksonJson 2019-06-09 18:18:37.241 INFO 14812 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using XML encoding codec XStreamXml 2019-06-09 18:18:37.241 INFO 14812 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using XML decoding codec XStreamXml 2019-06-09 18:18:37.423 INFO 14812 --- [ main] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration 2019-06-09 18:18:37.464 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Disable delta property : false 2019-06-09 18:18:37.465 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Single vip registry refresh property : null 2019-06-09 18:18:37.465 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Force full registry fetch : false 2019-06-09 18:18:37.465 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Application is null : false 2019-06-09 18:18:37.465 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Registered Applications size is zero : true 2019-06-09 18:18:37.465 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Application version is -1: true 2019-06-09 18:18:37.465 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Getting all instance registry info from the eureka server 2019-06-09 18:18:37.606 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : The response status is 200 2019-06-09 18:18:37.621 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Starting heartbeat executor: renew interval is: 30 2019-06-09 18:18:37.621 INFO 14812 --- [ main] c.n.discovery.InstanceInfoReplicator : InstanceInfoReplicator onDemand update allowed rate per min is 4 2019-06-09 18:18:37.621 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Discovery Client initialized at timestamp 1560075517621 with initial instances count: 2 2019-06-09 18:18:37.621 INFO 14812 --- [ main] o.s.c.n.e.s.EurekaServiceRegistry : Registering application TRANSACTION-MANAGER with eureka with status UP 2019-06-09 18:18:37.621 INFO 14812 --- [ main] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1560075517621, current=UP, previous=STARTING] 2019-06-09 18:18:37.621 INFO 14812 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_TRANSACTION-MANAGER/DESKTOP-242V863:TransactionManager:7970: registering service... 2019-06-09 18:18:37.668 INFO 14812 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 7970 (http) with context path '' 2019-06-09 18:18:37.668 INFO 14812 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 7970 2019-06-09 18:18:37.668 INFO 14812 --- [ main] com.manager.TcManagerApplication : Started TcManagerApplication in 7.483 seconds (JVM running for 7.935) 2019-06-09 18:18:37.668 INFO 14812 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_TRANSACTION-MANAGER/DESKTOP-242V863:TransactionManager:7970 - registration status: 204 2019-06-09 18:18:37.778 INFO 14812 --- [ main] c.c.t.t.n.i.NettyRpcServerInitializer : Socket started on 127.0.0.1:8070 2019-06-09 18:18:37.793 INFO 14812 --- [ntLoopGroup-4-1] io.netty.handler.logging.LoggingHandler : [id: 0xd80096dd] REGISTERED 2019-06-09 18:18:37.793 INFO 14812 --- [ntLoopGroup-4-1] io.netty.handler.logging.LoggingHandler : [id: 0xd80096dd] BIND: /127.0.0.1:8070 2019-06-09 18:18:37.793 INFO 14812 --- [ntLoopGroup-4-1] io.netty.handler.logging.LoggingHandler : [id: 0xd80096dd, L:/127.0.0.1:8070] ACTIVE 2019-06-09 18:18:37.871 INFO 14812 --- [ main] io.lettuce.core.EpollProvider : Starting without optional epoll library 2019-06-09 18:18:37.871 INFO 14812 --- [ main] io.lettuce.core.KqueueProvider : Starting without optional kqueue library 2019-06-09 18:18:38.043 INFO 14812 --- [ main] c.c.t.t.s.s.impl.ManagerServiceImpl : Acquired machine id 40, max machine id is: 2251799813685246二、TX-LCN的服務端搭建完成后,下一步我們就可以針對我們自己的項目設置分布式事務了。配置過程如下:
1、第一步我們先創(chuàng)建我們自己的微服務。如果有現(xiàn)成的微服務也可以在原有的微服務的基礎上改造。為了測試方便,我這里創(chuàng)建了兩個最簡單的微服務。分別叫tc-client-1和tc-client-2。由于只是測試分布式事務,因此這兩個項目我建設的完全一樣。只有名稱不一樣。
2、項目創(chuàng)建后,修改依賴信息形成的pom.xml文件內(nèi)容如下:
<?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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.client</groupId><artifactId>tc-client-1</artifactId><version>0.0.1-SNAPSHOT</version><name>tc-client-1</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Finchley.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.4</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</version></dependency> <dependency><groupId>com.codingapi.txlcn</groupId><artifactId>txlcn-tc</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>com.codingapi.txlcn</groupId><artifactId>txlcn-txmsg-netty</artifactId><version>5.0.2.RELEASE</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>3、修改application.properties文件,我這里將application.properties文件改名為application.yml文件,因此格式是yml格式。
注意:
tx-lcn:
? client:
??? manager-address: 127.0.0.1:8070
這個配置信息是服務器端的監(jiān)聽端口,在服務器端通過tx-lcn.manager.port,tx-lcn.manager.host這兩個屬性進行的配置
tc-client-1項目的配置代碼如下:
server:port: 10002spring: application:name: client1eureka:instance:appname: client1prefer-ip-address: trueclient: service-url:defaultZone: http://admin:admin@localhost:8761/eureka--- spring: datasource: password: 123456username: rooturl: jdbc:mysql://10.115.132.12:3306/tx?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNulldriver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid: validation-query: select '*'initial-size: 1max-active: 20max-wait: 1000filters: statpool-prepared-statements: falseredis: port: 6379host: 10.115.132.12database: 0jedis:pool:max-idle: 20max-active: 20max-wait: -1min-idle: 0timeout: 1000transaction:rollback-on-commit-failure: truemybatis: mapper-locations: classpath*:com/client/dao/xml/*.xmltype-aliases-package: com.client.dao.mappertx-lcn:client:manager-address: 127.0.0.1:8070 feign:client:config:default: connect-timeout: 10000read-timeout: 20000service-test:connect-timeout: 10000read-timeout: 20000hystrix:enabled: truemanagement:endpoints: web:exposure:include:"*"endpoint:health:show-details: always?tc-client-2項目的配置代碼為:
server:port: 10003spring: application:name: client2eureka:instance:appname: client2prefer-ip-address: trueclient: service-url:defaultZone: http://admin:admin@localhost:8761/eureka--- spring: datasource: password: 123456username: rooturl: jdbc:mysql://10.115.132.12:3306/tx?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNulldriver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid: validation-query: select '*'initial-size: 1max-active: 20max-wait: 1000filters: statpool-prepared-statements: falseredis: port: 6379host: 10.115.132.12database: 0jedis:pool:max-idle: 20max-active: 20max-wait: -1min-idle: 0timeout: 1000transaction:rollback-on-commit-failure: truemybatis: mapper-locations: classpath*:com/client/dao/xml/*.xmltype-aliases-package: com.client.dao.mappertx-lcn:client:manager-address: 127.0.0.1:8070 feign:client:config:default: connect-timeout: 10000read-timeout: 20000service-test:connect-timeout: 10000read-timeout: 20000hystrix:enabled: truemanagement:endpoints: web:exposure:include:"*"endpoint:health:show-details: always4、在tx這個數(shù)據(jù)庫中創(chuàng)建我們要操作的表test_1和test_2。這兩個表的類型必須為innodb。MYISAM格式是不支持事務的。結構如下圖:
5、開始編整合事務。
tc-client-1 項目的結構如下:
其中TcClient1Application作為啟動類,需要加入@EnableDistributedTransaction和@EnableTransactionManagement這兩個注解。生成的代碼如下:
package com.client;import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement;import com.codingapi.txlcn.tc.config.EnableDistributedTransaction;@SpringBootApplication @EnableFeignClients @EnableCircuitBreaker @EnableDiscoveryClient @ComponentScan("com.client.service") @MapperScan("com.client.dao") @EnableDistributedTransaction @EnableTransactionManagement public class TcClient1Application {public static void main(String[] args) {SpringApplication.run(TcClient1Application.class, args);}}TestService作用事務的處理類也需要加入事務注解,??? @LcnTransaction(propagation = DTXPropagation.SUPPORTS)
??? @Transactional 。由于這個是被作用被調(diào)用者使用的,因此需要在注解中加入propagation = DTXPropagation.SUPPORTS配置。形成的代碼如下:
其他model類,dao層的數(shù)據(jù)庫操作方法大概按原來的方式寫即可。沒有特別需要注意的。
6、下一步就是修改tc-client-2項目了,這個項目是需要調(diào)用tc-client-1這個微服務的。它的結構如下:
從兩個結構圖中可以看出,這個項目多了一個ClientService類用于調(diào)用tc-client-1這個項目。它的代碼如下:
package com.client.service;import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping;@FeignClient(name="client1") public interface ClientService {@RequestMapping("/test")public int insertTest() throws Exception; }這個項目的啟動類也是TcClient1Application,它的代碼和tc-client-1項目沒有任何區(qū)別,都是在原有項目的基礎上增加了@EnableDistributedTransaction
@EnableTransactionManagement
這兩個注解。
package com.client;import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.ComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement;import com.codingapi.txlcn.tc.config.EnableDistributedTransaction;@SpringBootApplication @EnableFeignClients @EnableCircuitBreaker @EnableDiscoveryClient @ComponentScan("com.client.service") @MapperScan("com.client.dao") @EnableDistributedTransaction @EnableTransactionManagement public class TcClient1Application {public static void main(String[] args) {SpringApplication.run(TcClient1Application.class, args);}}這個項目中的TestService服務調(diào)用類有一點不同,代碼如下:
package com.client.service;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import com.client.dao.mapper.TestMapper; import com.client.model.TestModel; import com.codingapi.txlcn.tc.annotation.DTXPropagation; import com.codingapi.txlcn.tc.annotation.LcnTransaction;@Service public class TestService {@Autowiredprivate TestMapper mapper;@Autowiredprivate ClientService client;@LcnTransaction@Transactionalpublic int insert() throws Exception{client.insertTest();TestModel test = new TestModel();test.setId("1");test.setName("name");test.setType(1);return mapper.insert(test);} }它雖然也加了@LcnTransaction這個注解,但由于這里是調(diào)用其他服務的,因此這個注解中不能配置其他屬性。
這個項目中dao層和Model層相關的代碼如tc-client-1完全相同,小伙伴們按照自己喜歡的方式寫就可以了。
到這里就大功告成了。小伙伴們可以自己修改一個數(shù)據(jù)庫結構讓其中一個數(shù)據(jù)插入不成功,看看成果。
注意:
1、數(shù)據(jù)庫表結構必須為innoDB
2、在啟動類上一定要加入@EnableDistributedTransaction
3、當調(diào)用其他服務時@LcnTransaction注解不能加入其他參數(shù)
4、被調(diào)用的服務@LcnTransaction注解一定要加入propagation = DTXPropagation.SUPPORTS這個配置
總結
以上是生活随笔為你收集整理的基于springboot2.0.6版本的TX-LCN分布式事务搭建说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apollo java客户端_携程配置中
- 下一篇: 大数据安全分析漫谈