日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springcloud搭建以及集成tx-lcn分布式事务解决框架

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springcloud搭建以及集成tx-lcn分布式事务解决框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文檔采用框架版本,請嚴格按照文檔版本,否則將可能造成版本沖突

框架名稱框架版本
springboot2.0.4.RELEASE
springcloudFinchley.SR1
jdk1.8
tx-lcn5.0.2.RELEASE
使用了哪些springcloud組件
組件名稱作用
eureka注冊中心
zuul網關
hystrix斷路器
feign聲明式遠程調用組件
config配置中心
微服務架構流程圖

Eureka搭建流程

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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.dsk</groupId><artifactId>dsk_eureka</artifactId><version>0.0.1-SNAPSHOT</version><name>dsk_eureka</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties><dependencies><!--引入注冊中心的服務端依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><!--安全組件,目的給注冊中心加密--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></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>

配置文件yml:

spring:security:user:name: dsj #注冊中心登錄用戶名和密碼password: 123456 server:port: 8761 eureka:client:register-with-eureka: false #測試環境不需要高可用fetch-registry: falseservice-url:defaultZone: http://dsj:123456@localhost:8761/eurekainstance:prefer-ip-address: true #顯示ip

因為新版本啟動認證需要改變認證方式,我們需要在啟動類的目錄下新建一個config包新建一個類,如下:

package com.dsk.dsk_eureka.config;import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;/*** @author 彭偉* @Date 2019/4/3 10:05* 改變認證方式*/ @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().ignoringAntMatchers("/**").and().authorizeRequests().anyRequest().authenticated().and().httpBasic();} }
eureka細節問題:
1、Eureka Server提供服務注冊和發現 2、Service Provider服務提供方將自身服務注冊到Eureka,從而使服務消費方能夠找到 3、Service Consumer服務消費方從Eureka獲取注冊服務列表,從而能夠消費服務 4,加入安全認證是為了提高安全性,防止服務信息泄漏。

最后啟動類上面加上@EnableEurekaServer注解,
到此,注冊中心搭建完畢.

搭建測試生產服務

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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.dsk</groupId><artifactId>dsk_xcx</artifactId><version>0.0.1-SNAPSHOT</version><name>dsk_xcx</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--dashborad監控需要--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version></dependency><!--注冊中心的客戶端依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- alibaba的druid數據庫連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></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>

配置文件application.yml如下:

eureka:client:serviceUrl:defaultZone: http://dsj:123456@localhost:8761/eurekainstance:instance-id: ${spring.cloud.client.ip-address}:${server.port}prefer-ip-address: true #顯示ip server:port: 8070 spring:application:name: dsk-xcxdatasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:filters: stat # 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用于防火墻driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/testcloud?useUnicode=true&characterEncoding=utf-8username: rootpassword: #配置初始化大小/最小/最大initialSize: 1minIdle: 1maxActive: 20#獲取連接等待超時時間maxWait: 60000#間隔多久進行一次檢測,檢測需要關閉的空閑連接timeBetweenEvictionRunsMillis: 60000#一個連接在池中最小生存的時間minEvictableIdleTimeMillis: 300000 #開始配置mybatis mybatis:mapper-locations: classpath:mapper/*.xml #指定mapper文件地址type-aliases-package: com.dsk.dsk_xcx.modle #指定別名包 logging:level:com.codingapi.txlcn: debug #配置com.dsk.dsk_xcx包下面所有類以debug日志級別輸出 mydurid: #配置druid的監控頁面安全認證username: adminpassword: 123456 #暴露全部的監控信息 management:endpoints:web:exposure:include: "*"

因為此處開起了druid的監控系統,所以需要加上配置類,創建config包,代碼如下:

package com.dsk.dsk_xcx.config;import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** @author 彭偉* 配置Druid監控服務,因為主類里面關閉了自動配置*/ @Configuration public class DruidConfiguration {@Value("${mydurid.username}")private String username;@Value("${mydurid.password}")private String password;@Beanpublic ServletRegistrationBean druidStatViewServle() {//注冊服務ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");// 白名單(為空表示,所有的都可以訪問,多個IP的時候用逗號隔開)servletRegistrationBean.addInitParameter("allow", "127.0.0.1");// IP黑名單 (存在共同時,deny優先于allow)servletRegistrationBean.addInitParameter("deny", "127.0.0.2");// 設置登錄的用戶名和密碼servletRegistrationBean.addInitParameter("loginUsername", username);servletRegistrationBean.addInitParameter("loginPassword", password);// 是否能夠重置數據.servletRegistrationBean.addInitParameter("resetEnable", "false");return servletRegistrationBean;}@Beanpublic FilterRegistrationBean druidStatFilter() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());// 添加過濾規則filterRegistrationBean.addUrlPatterns("/*");// 添加不需要忽略的格式信息filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");System.out.println("druid初始化成功!");return filterRegistrationBean;} }

因為此處測試采用的是mybatis框架的動態mapper來進行持久化操作,所以需要在配置文件中指定mapper文件位置,我的在resource目錄下新建了一個mapper文件,并且配置了。

package com.dsk.dsk_xcx;import com.codingapi.txlcn.tc.config.EnableDistributedTransaction; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication @EnableEurekaClient//注冊到eureka @MapperScan("com.dsk.dsk_xcx.dao")//mybatis動態代理的mapper包 public class DskXcxApplication {public static void main(String[] args) {SpringApplication.run(DskXcxApplication.class, args);System.out.println("啟動成功......");}}
測試生成服務心得
1,增加了druid監控系統,讓我們可以清楚看到哪些慢sql以及連接池當前狀態信息等。從此節省了我們定位慢sql的時間。 2,因為開啟監控所以需要重新對其進行配置。 3,訪問方式當前服務ip+port/durid/index.html

搭建測試消費服務

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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.dsj</groupId><artifactId>dsk_consumer</artifactId><version>0.0.1-SNAPSHOT</version><name>dsk_consumer</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties><dependencies><!--boot config start--><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>2.0.0</version></dependency><!--boot config end--><!--cloud config start--><!--eureka客戶端依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--feign依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--hystrix依賴,主要是用 @HystrixCommand--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><!--cloud config end--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- alibaba的druid數據庫連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</version></dependency><!--dashborad需要--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></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>

配置文件如下:

eureka:client:serviceUrl:defaultZone: http://dsj:123456@localhost:8761/eurekainstance:instance-id: ${spring.cloud.client.ip-address}:${server.port}prefer-ip-address: true #顯示ip server:port: 8080 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:filters: stat # 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用于防火墻driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://***:3306/testcloud?useUnicode=true&characterEncoding=utf-8username: rootpassword: ***#配置初始化大小/最小/最大initialSize: 1minIdle: 1maxActive: 20#獲取連接等待超時時間maxWait: 60000#間隔多久進行一次檢測,檢測需要關閉的空閑連接timeBetweenEvictionRunsMillis: 60000#一個連接在池中最小生存的時間minEvictableIdleTimeMillis: 300000 #開始配置mybatis mybatis:mapper-locations: classpath:mapper/*.xml #指定mapper文件地址type-aliases-package: com.dsj.dsk_consumer.modle #指定別名包 logging:level:com.codingapi.txlcn: debug #配置com.dsj.dsk_consumer包下面所有類以debug日志級別輸出 mydurid: #配置druid的監控頁面安全認證username: adminpassword: 123456 #修改調用超時時間,feign feign:hystrix:enabled: trueclient:config:default:connectTimeout: 3000readTimeout: 3000 #設置超時時間,hystrix hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 3000 #暴露全部的監控信息 management:endpoints:web:exposure:include: "*"

同樣開起了連接池監控后臺:需要重復生產者操作。

package com.dsj.dsk_consumer;import com.codingapi.txlcn.tc.config.EnableDistributedTransaction; 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.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication @EnableEurekaClient//eureka客戶端 @MapperScan("com.dsj.dsk_consumer.dao")//mybatis掃描mapper包 @EnableCircuitBreaker//Hystrix @EnableFeignClients(basePackages = "com.dsj.dsk_consumer.feign")//開啟feign,注意一定要指定包,要不然會報錯,版本原因 public class DskConsumerApplication {public static void main(String[] args) {SpringApplication.run(DskConsumerApplication.class, args);} }

feign和斷路器的使用:

package com.dsj.dsk_consumer.feign;import com.dsj.dsk_consumer.modle.Test; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;/*** @author 彭偉* @Date 2019/4/3 13:58* api接口*/ @FeignClient(name = "dsk-xcx", fallback = HystrixClientFallback.class) //name中是被調用方的spring.application.name,fallback斷路器返回結果 public interface TestFeignClient {@RequestMapping(value = "/test/findAll", method = RequestMethod.GET)Object findAll();// consumes = "application/json"@RequestMapping(value = "/test/add", method = RequestMethod.POST,consumes = "application/json")String insert(@RequestBody Test test); }

feign回滾操作,需要實現feign接口并重寫方法

package com.dsj.dsk_consumer.feign;import com.dsj.dsk_consumer.modle.Test; import org.springframework.stereotype.Component;/*** @author 彭偉* @Date 2019/4/3 14:16*/ @Component public class HystrixClientFallback implements TestFeignClient {@Overridepublic Object findAll() {return "失敗";}@Overridepublic String insert(Test test) {return "失敗";} }

最后在斷路器中進行異常通知操作:

@GetMapping("/findAll")@HystrixCommand(fallbackMethod = "findAllFail")public Object findAll(HttpServletRequest request) {return feignClient.findAll();}//注意,方法簽名一定要要和api方法一致private Object findAllFail(HttpServletRequest request) {//監控報警String saveOrderKye = "dsk-xcx";String sendValue = ""; // String sendValue = redisTemplate.opsForValue().get(saveOrderKye);final String ip = request.getRemoteAddr();new Thread(() -> {if (StringUtils.isBlank(sendValue)) {System.out.println("緊急短信,調用失敗,請離開查找原因,ip地址是=" + ip);//發送一個http請求,調用短信服務 TODO // redisTemplate.opsForValue().set(saveOrderKye, "save-order-fail", 20, TimeUnit.SECONDS);} else {System.out.println("已經通知開發人員,20秒內不重復發送");}}).start();Map<String, Object> msg = new HashMap<>();msg.put("code", -1);msg.put("msg", "訪問人數太多,您被擠出來了,稍等重試");return msg;}
搭建消費者是的心得
1,因為消費者端集成了Hystrix和feign等組件,但是因為cloud版本原因需要注意maven坐標以及配置問題。 2,同時配置文件特別需要注意的是feign和Hystrix都需要配置超時時間,建議配成一樣的,如果不配成一樣的會以Hystrix為準。 3,因為springcloud的ioc容器是父子容器,意味著feign包下面的類其實又是另一個ioc容器,所以當前版本不需要在啟動類外層目錄下創建新的包,但是需要指定包名。

網關zuul搭建步驟:

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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.dsj</groupId><artifactId>dsk_zuul</artifactId><version>0.0.1-SNAPSHOT</version><name>dsk_zuul</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--引入zuul服務依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></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>

配置文件如下:

eureka:client:serviceUrl:defaultZone: http://dsj:123456@localhost:8761/eurekainstance:instance-id: ${spring.cloud.client.ip-address}:${server.port}prefer-ip-address: true #顯示ip server:port: 8002 spring:servlet:multipart:max-file-size: 100Mbmax-request-size: 100Mb ribbon:ReadTimeout: 5000ConnectTimeout: 5000 zuul:routes:api-a:path: /api-xcx/**service-id: dsk-xcxapi-b:path: /api-cu/**service-id: dsk-consumer #處理請求頭中敏感信息被過濾問題,放空就不會導致下游服務取不到cookie問題sensitive-headers:

啟動類:

package com.dsj.dsk_zuul;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Bean; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter;@EnableZuulProxy//zuul //@EnableEurekaClient //zull里面已經集成了 @SpringBootApplication public class DskZuulApplication {public static void main(String[] args) {SpringApplication.run(DskZuulApplication.class, args);}}

限流過濾器:

package com.dsj.dsk_zuul.filter;import com.google.common.util.concurrent.RateLimiter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;/*** @author 彭偉* @Date 2019/4/8 10:41* 限流*/ @Component public class CurrentFilter extends ZuulFilter {//每秒產生1000個令牌,根據令牌來進行限流private static final RateLimiter RATE_LIMITER = RateLimiter.create(1);@Overridepublic String filterType() {return PRE_TYPE;//采用前置過濾}@Overridepublic int filterOrder() {return -4;//優先級,因為限流采用最高優先級,越小優先級越高}@Overridepublic boolean shouldFilter() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest request = requestContext.getRequest();//獲取當前請求頭信息,對需要過濾的服務進行限流return true;}@Overridepublic Object run() throws ZuulException {RequestContext requestContext = RequestContext.getCurrentContext();if (!RATE_LIMITER.tryAcquire()) {//沒有獲取到令牌,不放行并且返回響應結果,可自定義requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value());requestContext.setResponseBody("當前訪問人數過多,您被擠出來了");requestContext.getResponse().setContentType("application/json;charset=UTF-8");}return null;} }
zuul心得
1,其實就是統一了入口,需要注意的是寫filter必須繼承zuulfilter,需要指定前置還是后置過濾器。 2,同時需要注意的是因為內置對cookie等敏感信息屏蔽了,需要通過配置文件對其進行打開,詳細配置請看配置文件。 3,限流需要經過準確的壓測來進行綜合性的評估,令牌桶算法會耗費一點資源,需要除去令牌桶算法的資源。

搭建配置中心服務端

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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.dsj</groupId><artifactId>dsk_config_server</artifactId><version>0.0.1-SNAPSHOT</version><name>dsk_config_server</name><description>配置服務器</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency><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></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>

配置文件:

spring:application:name: config-servercloud:config:server:git:uri: https://gitee.com/itpengwei/cloud-config #倉庫地址,注意去掉.gitusername: #用戶名password: #密碼timeout: 5 #超時時間,單位為sdefault-label: master #分支 server:port: 9100 eureka:client:serviceUrl:defaultZone: http://dsj:123456@localhost:8761/eurekainstance:instance-id: ${spring.cloud.client.ip-address}:${server.port}prefer-ip-address: true

啟動類:

package com.dsj.dsk_config_server;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer;@SpringBootApplication @EnableConfigServer public class DskConfigServerApplication {public static void main(String[] args) {SpringApplication.run(DskConfigServerApplication.class, args);}}

客戶端使用,例如我這用zuul來示范

注意事項1,配置文件一定要改名成bootstrap.yml這樣才能優先加載,其他配置可以全部放倉庫

eureka:client:serviceUrl:defaultZone: http://dsj:123456@localhost:8761/eurekainstance:instance-id: ${spring.cloud.client.ip-address}:${server.port}prefer-ip-address: true #顯示ip #服務的名稱 spring:application:name: dsk-zuul#指定從哪個配置中心讀取cloud:config:discovery:service-id: config-serverenabled: true#建議用lable去區分環境,默認是lable是master分支label: master

倉庫配置文件名稱和服務名稱一致既可;
pom文件加入如下依賴:

<!--配置中心客戶端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-client</artifactId></dependency>

到此就完成了
config客戶端從服務端拉去配置的操作。

config的心得
1,服務端一定要能夠連接到遠程倉庫。 2,需要在客戶端啟動之前啟動。 3,倉庫的uri需要去掉后綴.git 4,服務端和客戶端都需要指定從哪個分支拉取配置。 5,倉庫的配置文件最好和服務名一致。 6,客戶端一定要把配置文件改名成bootstrap.yml,讓spring先對里面配置進行加載。

搭建dashboad監控服務

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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.dsj</groupId><artifactId>dsk_hystrix_dashboard</artifactId><version>0.0.1-SNAPSHOT</version><name>dsk_hystrix_dashboard</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></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>

配置文件:

server:port: 8900

啟動類;

package com.dsj.dsk_hystrix_dashboard;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;@SpringBootApplication @EnableHystrixDashboard//開啟自動dashboard的自動裝配,適用于單機,集群不適合 public class DskHystrixDashboardApplication { // http://localhost:8781/hystrix // http://192.168.25.1:8080/actuator/hystrix.streampublic static void main(String[] args) {SpringApplication.run(DskHystrixDashboardApplication.class, args);}}

被監控的服務需要滿足以下條件

1,消費了其他服務 2,pom文件需要添加依賴 <!--dashborad需要--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> 3,然后啟動監控服務瀏覽器輸入http://localhost:8900/hystrix 4,輸入消費者服務的地址格式如下: http://192.168.25.1:8080/actuator/hystrix.stream 5,將鏈接放入最大的那個框,點擊監控,既可與被監控的服務建立連接
dashborad注意事項
1,監控的一定要是一個消費者,被監控者一定要添加上面的mavne依賴。 2,想看到監控數據一定要先訪問那個被監控服務的接口,那個接口一定要是調用了其他服務。 3,監控的是實時數據,具體多少秒內可以在可視化界面第二行最左邊那個框里面輸入,單位是ms。 4,建議采用默認,因為監控同時也在耗費那個被監控的服務器資源。

集成分布式事務協調框架tx-lcn

第一步先搭建tx-mange事務管理器

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><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><!--<version>2.1.0.RELEASE</version>--><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.dsk</groupId><artifactId>tx-manger</artifactId><version>0.0.1-SNAPSHOT</version><name>tx-manger</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</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-jdbc</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>2.0.0</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</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.codingapi.txlcn</groupId><artifactId>txlcn-tm</artifactId><version>5.0.2.RELEASE</version></dependency><!-- alibaba的druid數據庫連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</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>

配置文件如下:

spring.application.name=tx-manager server.port=7970spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://211.159.169.156:3306/tx-manager?useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=dsj123456 #指定注冊中心地址 eureka.client.serviceUrl.defaultZone= http://dsj:123456@localhost:8761/eureka eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port} eureka.instance.prefer-ip-address=truemybatis.configuration.map-underscore-to-camel-case=true mybatis.configuration.use-generated-keys=true# TxManager Host Ip tx-lcn.manager.host=127.0.0.1 # TxClient連接請求端口 tx-lcn.manager.port=5800 # 心跳檢測時間(ms) tx-lcn.manager.heart-time=15000 # 分布式事務超時時間 tx-lcn.manager.dtx-time=5000 #參數延遲刪除時間單位ms tx-lcn.message.netty.attr-delay-time=10000 # 事務處理并發等級. 默認為機器邏輯核心數5倍 tx-lcn.manager.concurrent-level=128 # 開啟日志,默認為false tx-lcn.logger.enabled=true logging.level.com.codingapi=debug 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 主機 spring.redis.host=*** #redis 端口 spring.redis.port=6379 #redis 密碼 spring.redis.password=*** tx-lcn.manager.admin-key=123456 ##發生異常發送郵件給管理員 #spring.mail.host=smtp.126.com #spring.mail.port=25 #spring.mail.username=pw1914109147@126.com #spring.mail.password= # 異常回調開關。開啟時請制定ex-url #tx-lcn.manager.ex-url-enabled=true # 事務異常通知(任何http協議地址。未指定協議時,為TM提供內置功能接口)。默認是郵件通知 #tx-lcn.manager.ex-url=/provider/email-to/1914109147@qq.com #tx-lcn.manager.ex-url=http://192.168.25.1:8002/api-cu/test/findAll

啟動類;

package com.dsk.txmanger;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import com.codingapi.txlcn.tm.config.EnableTransactionManagerServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication @EnableEurekaClient @EnableTransactionManagerServer //@EnableAutoConfiguration(exclude = {DruidDataSourceAutoConfigure.class}) public class TxMangerApplication {public static void main(String[] args) {SpringApplication.run(TxMangerApplication.class, args);}}
tx-manger注意事項
1,pom文件最好延用上述的,要不然可能產生版本沖突,以上版本都是經過嚴格測試得出的。 2,配置文件里面的服務名稱不能改動。 3,事務消息端口不要與其他服務端口沖突。
客戶端使用

pom文件加入如下依賴:

<!--lcn事務客戶端開始--><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><!--lcn事務客戶端結束-->

配置文件加入如下配置:

#lcn事務管理器ip端口 tx-lcn:client:manager-address: 127.0.0.1:5800 #tm集群的情況下可以寫多個地址,逗號隔開 # ribbon: # loadbalancer: # dtx: # enabled: true #是否采用輪訓

啟動類加上注解:@EnableDistributedTransaction
最后事務發起方A調用了事務參與方B,那么兩者都需要加上

@LcnTransaction//分布式事務 @Transactional//本地事務注解
分布式事務客戶端注意事項
1,service層里面一定不要用一個try把幾個db操作都給包起來,可以把try放到controller里面去。要不然會造成事務不回滾,框架會認為沒有拋出事務。 2,配置的事務管理器ip一定要和tm的一致,端口是事務消息端口,并不是服務端口。 3,集群配置在配置文件里面有詳細說明。

參考資料

tx-lcn管網

tx-lcn的github社區

dubbo和springcloud對比

注冊中心eureka和其他組件資料

ribbon自定義資料

Hystrix資料

微服務系列文章-方志鵬

微服務系列-純潔的微笑

微服務系列-江南一點雨

總結

以上是生活随笔為你收集整理的springcloud搭建以及集成tx-lcn分布式事务解决框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。