接上篇文章:SpringCloud:高級上篇,負載均衡Ribbon及策略,聲明式服務調用Feign及性能優化,服務容錯保護Hystrix雪崩Feign線程池與信號量隔離RabbitMQ監控,微服務設計模式及項目
SpringCloud高級部分(下篇)
目錄
3 啓動dashboard-view服務通過可視化界面查看監控數據... 22
3 爲什麼要使用spring cloud config 配置中心?... 2
4 spring cloud config 配置中心,它解決了什麼問題?... 2
4 在git端修改配置後,在不重啓服務中如何讓客戶端生效... 10
二、 採用bus實現自動刷新配置信息-Client刷新... 2
三、 採用bus實現自動刷新配置信息-Server刷新... 5
第五章 服務網關Zuul
(Spring Cloud高級)
一、 什麼是網關服務
1 爲什麼要使用網關
2 網關解決了什麼問題
二、 編寫網關服務入門案例
1 創建項目
2 修改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> <groupId>com.bjsxt</groupId> <artifactId>zuul-gateway</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
3 修改配置文件
spring.application.name=zuul-gateway server.port=9020 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ |
4 修改啓動類
@SpringBootApplication @EnableZuulProxy public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } } |
5 通過網關請求服務
http://網關服務地址:網關服務端口/訪問的服務的名稱/訪問的服務中的接口的地址
三、 路由器的4種路由規則方法
1 創建項目
2 採用URL指定路由方式
2.1 修改配置文件配置路由規則
spring.application.name=zuul-gateway-route server.port=9030 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ # 1 ###################### 路由指定:URL指定 ############################# # URL匹配關鍵字,如果包含關鍵字就跳轉到指定的URL中 zuul.routes.e-book-product-provider.path=/e-book-product-provider/** zuul.routes.e-book-product-provider.url=http://127.0.0.1:9001/ |
2.2 通配符含義
3 採用服務名稱指定路由方式
## 2 ###################### 路由指定:服務指定1 ############################# ##將路徑的/suibian/引到 eureka的e-book-product-provider服務上 ##規則:zuul.routes.路徑名.path ##規則:zuul.routes.路徑名.serviceId=eureka的服務名 #zuul.routes.e-book-product-provider.path=/suibian/** #zuul.routes.e-book-product-provider.serviceId=e-book-product-provider ## 3 ###################### 路由指定:服務指定2 ############################# #zuul.routes後面跟着的是服務名,服務名後面跟着的是路徑規則,這種配置方式更簡單。 zuul.routes.e-book-product-provider.path=/suibian/** |
4 路由的排除方法
## 4 ###################### 路由排除:排除某幾個服務 ############################# ##排除後,這個地址將爲空 http://127.0.0.1:9030/e-book-product-provider/product/findAll ## 多個服務逗號隔開 #zuul.ignored-services=e-book-product-provider ## 5 ###################### 路由排除:排除所有服務 ############################# #由於服務太多,不可能手工一個個加,故路由排除所有服務,然後針對要路由的服務進行手工加 #zuul.ignored-services=* #zuul.routes.e-book-order-provider.path=/e-book-order-provider/** ## 6 ###################### 路由排除:排除指定關鍵字的路徑 ############################# # 排除所有包括/list/的路徑 zuul.ignored-patterns=/**/findAll/** zuul.routes.e-book-order-provider.path=/suibian/** |
5 路由的添加前綴方法
## http://127.0.0.1:9030/suibian/product-provider/product/findAll zuul.prefix=/suibian zuul.routes.e-book-product-provider.path=/product-provider/** |
四、 自定義網關過濾器
1 編寫網關過濾器
1.1 創建項目
1.2 修改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> <groupId>com.bjsxt</groupId> <artifactId>zuul-gateway-filter</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
1.3 修改配置文件
spring.application.name=zuul-gateway-filter server.port=9020 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ |
1.4 創建過濾器
@Component public class LogFilter extends ZuulFilter { private static final Logger logger = LoggerFactory.getLogger(LogFilter.class); /** * 過濾內容:在run方法編寫過濾邏輯 */ @Override public Object run() { //獲取請求上下文 RequestContext rc = RequestContext.getCurrentContext(); HttpServletRequest request = rc.getRequest(); logger.info("LogFilter.....method={},url={}",request.getMethod(),request.getRequestURL().toString()); return null; } /** * 是否開啓過濾器:默認爲false不開啓 */ @Override public boolean shouldFilter() { // TODO Auto-generated method stub return true; } /** * 過濾器的執行順序:通過整數表示順序,數值越小,優先級越高 */ @Override public int filterOrder() { // TODO Auto-generated method stub return 0; } /** * 過濾器類型:通過過濾器類型決定了過濾器執行的時間 */ @Override public String filterType() { return "pre"; } }
|
2 過濾器類型
3 Zuul請求的生命週期
4 採用網關過濾器實現權限驗證
需求:在網關過濾器中通過Token判斷用戶是否登錄
4.1 創建項目
4.2 修改pom文件添zuul座標
<?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> <groupId>com.bjsxt</groupId> <artifactId>zuul-gateway-example</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
4.3 修改配置文件
spring.application.name=zuul-gateway-example server.port=9020 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ |
4.4 創建AccessFilter
/** * 登錄權限驗證 * @author Administrator * */ @Component public class AccessFilter extends ZuulFilter { private static final Logger logger = LoggerFactory.getLogger(AccessFilter.class); /** * 過濾內容:在run方法編寫過濾邏輯 */ @Override public Object run() { //獲取請求上下文 RequestContext rc = RequestContext.getCurrentContext(); HttpServletRequest request = rc.getRequest(); logger.info("------------------------pre1-----------------------------"); //獲取表單中的token String token = request.getParameter("token"); //對token做判斷 if(token == null){ logger.warn("token is null............"); rc.setSendZuulResponse(false);//代表請求結束。不在繼續向下請求 rc.setResponseStatusCode(401);//添加一個響應的狀態碼 rc.setResponseBody("{\"result\":\"token is null\"}");//響應內容 rc.getResponse().setContentType("text/html;charset=utf-8");//響應類型 }else{ //訪問redis服務 進行驗證 logger.info("token is OK"); } return null; } /** * 是否開啓過濾器:默認爲false不開啓 */ @Override public boolean shouldFilter() { // TODO Auto-generated method stub return true; } /** * 過濾器的執行順序:通過整數表示順序,數值越小,優先級越高 */ @Override public int filterOrder() { // TODO Auto-generated method stub return 0; } /** * 過濾器類型:通過過濾器類型決定了過濾器執行的時間 */ @Override public String filterType() { return "pre"; } }
|
5 網關過濾器執行順序與post類型演示
5.1 網關過濾器執行順序演示
5.1.1AccessFilter
/** * 執行順序演示 * @author Administrator * */ @Component public class AccessFilter extends ZuulFilter { private static final Logger logger = LoggerFactory.getLogger(AccessFilter.class); /** * 過濾內容:在run方法編寫過濾邏輯 */ @Override public Object run() { //獲取請求上下文 RequestContext rc = RequestContext.getCurrentContext(); HttpServletRequest request = rc.getRequest(); logger.info("------------------------pre1-----------------------------"); //獲取表單中的token String token = request.getParameter("token"); //對token做判斷 if(token == null){ logger.warn("token is null............"); rc.setSendZuulResponse(false);//代表請求結束。不在繼續向下請求 rc.setResponseStatusCode(401);//添加一個響應的狀態碼 rc.setResponseBody("{\"result\":\"token is null\"}");//響應內容 rc.getResponse().setContentType("text/html;charset=utf-8");//響應類型 }else{ //訪問redis服務 進行驗證 logger.info("token is OK"); } return null; } /** * 是否開啓過濾器:默認爲false不開啓 */ @Override public boolean shouldFilter() { // TODO Auto-generated method stub return true; } /** * 過濾器的執行順序:通過整數表示順序,數值越小,優先級越高 */ @Override public int filterOrder() { return 0; } /** * 過濾器類型:通過過濾器類型決定了過濾器執行的時間 */ @Override public String filterType() { return "pre"; } }
|
5.1.2AccessFilter2
/** * 執行順序演示 * @author Administrator * */ @Component public class AccessFilter2 extends ZuulFilter { private static final Logger logger = LoggerFactory.getLogger(AccessFilter2.class); /** * 過濾內容:在run方法編寫過濾邏輯 */ @Override public Object run() { //獲取請求上下文 RequestContext rc = RequestContext.getCurrentContext(); HttpServletRequest request = rc.getRequest(); logger.info("------------------------pre2-----------------------------"); return null; } /** * 是否開啓過濾器:默認爲false不開啓 */ @Override public boolean shouldFilter() { // TODO Auto-generated method stub return true; } /** * 過濾器的執行順序:通過整數表示順序,數值越小,優先級越高 */ @Override public int filterOrder() { // TODO Auto-generated method stub return 1; } /** * 過濾器類型:通過過濾器類型決定了過濾器執行的時間 */ @Override public String filterType() { return "pre"; } }
|
5.2 post類型演示
/** * post類型演示 * @author Administrator * */ @Component public class PostFilter extends ZuulFilter { private static final Logger logger = LoggerFactory.getLogger(PostFilter.class); /** * 過濾內容:在run方法編寫過濾邏輯 */ @Override public Object run() { //獲取請求上下文 RequestContext rc = RequestContext.getCurrentContext(); HttpServletRequest request = rc.getRequest(); logger.info("------------------------post-----------------------------"); return null; } /** * 是否開啓過濾器:默認爲false不開啓 */ @Override public boolean shouldFilter() { // TODO Auto-generated method stub return true; } /** * 過濾器的執行順序:通過整數表示順序,數值越小,優先級越高 */ @Override public int filterOrder() { // TODO Auto-generated method stub return 0; } /** * 過濾器類型:通過過濾器類型決定了過濾器執行的時間 */ @Override public String filterType() { return "post"; } }
|
6 採用網關過濾器對系統異常同一處理
6.1 創建ErrorFilter
/** * 異常處理演示 * @author Administrator * */ @Component public class ErrorFilter extends ZuulFilter { private static final Logger logger = LoggerFactory.getLogger(ErrorFilter.class); /** * 過濾內容:在run方法編寫過濾邏輯 */ @Override public Object run() { //獲取請求上下文 RequestContext rc = RequestContext.getCurrentContext(); HttpServletRequest request = rc.getRequest(); logger.info("------------------------error-----------------------------"); return null; } /** * 是否開啓過濾器:默認爲false不開啓 */ @Override public boolean shouldFilter() { // TODO Auto-generated method stub return true; } /** * 過濾器的執行順序:通過整數表示順序,數值越小,優先級越高 */ @Override public int filterOrder() { // TODO Auto-generated method stub return 1; } /** * 過濾器類型:通過過濾器類型決定了過濾器執行的時間 */ @Override public String filterType() { return "error"; } }
|
6.2 創建處理異常響應的控制器
/** * 對異常響應內如處理 * @author Administrator * */ @RestController public class ExceptionHandler implements ErrorController { @Override public String getErrorPath() { return "/error"; }
@RequestMapping(value="/error") public String error(){ return "{\"result\":\"500 error!!!!\"}"; } }
|
五、 網關容錯
1 zuul和hystrix無縫結合
在zuul的jar包中包含了hystrix的jar包。所以我們不需要在項目中添加Hystrix的座標
2 訪問網關服務的數據監控流
3 啓動dashboard-view服務通過可視化界面查看監控數據
4 在網關中實現對服務降級處理
4.1 創建項目
4.2 修改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> <groupId>com.bjsxt</groupId> <artifactId>zuul-gateway-fallback</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
4.3 修改配置文件
spring.application.name=zuul-gateway-fallback server.port=9020 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ |
4.4 添加ProviderProductFallback類
/** * 對Provider-Product服務降級處理 * @author Administrator * */ @Component public class ProductProviderFallback implements ZuulFallbackProvider { /** * 當服務無法執行時,該方法返回託底信息 */ @Override public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
/** * 設置響應的頭信息 */ @Override public HttpHeaders getHeaders() { HttpHeaders header = new HttpHeaders(); MediaType mt = new MediaType("application","json",Charset.forName("utf-8")); header.setContentType(mt); return header; }
/** * 設置響應體 */ @Override public InputStream getBody() throws IOException { String content = "商品服務不可用,請與管理員聯繫"; return new ByteArrayInputStream(content.getBytes()); }
/** * ClientHttpResponse的fallback的狀態碼 返回String */ @Override public String getStatusText() throws IOException { return this.getStatusCode().getReasonPhrase(); }
/** * ClientHttpResponse的fallback的狀態碼 返回HttpStatus */ @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; }
/** * ClientHttpResponse的fallback的狀態碼 返回int */ @Override public int getRawStatusCode() throws IOException { return this.getStatusCode().value(); } @Override public void close() { // TODO Auto-generated method stub
} }; } /** * 給定對哪個服務做降級處理 */ @Override public String getRoute() { return "e-book-product-provider"; } } |
六、 在高併發情況下,網關實現限流達到自我保護
1 創建項目
2 修改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> <groupId>com.bjsxt</groupId> <artifactId>zuul-gateway-ratelimt</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>com.marcosbarbero.cloud</groupId> <artifactId>spring-cloud-zuul-ratelimit</artifactId> <version>1.3.4.RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
3 修改配置文件
3.1 全侷限流
spring.application.name=zuul-gateway-ratelimit server.port=9020 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ zuul.routes.e-book-product-provider.path=/product/** zuul.routes.e-book-product-provider.serviceId=e-book-product-provider zuul.routes.e-book-order-provider.path=/order/** zuul.routes.e-book-order-provider.serviceId=e-book-order-provider #全局配置限流 zuul.ratelimit.enabled=true ##60s內請求超過3次,服務端就拋出異常,60s後可以恢復正常請求 zuul.ratelimit.default-policy.limit=3 zuul.ratelimit.default-policy.refresh-interval=60 ##針對IP進行限流,不影響其他IP zuul.ratelimit.default-policy.type=origin |
3.2 測試
3.3 局部限流
spring.application.name=zuul-gateway-ratelimit server.port=9020 #\u8bbe\u7f6e\u670d\u52a1\u6ce8\u518c\u4e2d\u5fc3\u5730\u5740\uff0c\u6307\u5411\u53e6\u4e00\u4e2a\u6ce8\u518c\u4e2d\u5fc3 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ zuul.routes.e-book-product-provider.path=/product/** zuul.routes.e-book-product-provider.serviceId=e-book-product-provider zuul.routes.e-book-order-provider.path=/order/** zuul.routes.e-book-order-provider.serviceId=e-book-order-provider #全局配置限流 #zuul.ratelimit.enabled=true ##60s內請求超過3次,服務端就拋出異常,60s後可以恢復正常請求 #zuul.ratelimit.default-policy.limit=3 #zuul.ratelimit.default-policy.refresh-interval=60 ##針對IP進行限流,不影響其他IP #zuul.ratelimit.default-policy.type=origin # 局部限流:針對某個服務進行限流 ##開啓限流 zuul.ratelimit.enabled=true ##60s內請求超過3次,服務端就拋出異常,60s後可以恢復正常請求 zuul.ratelimit.policies.e-book-product-provider.limit=3 zuul.ratelimit.policies.e-book-product-provider.refresh-interval=60 ##針對某個IP進行限流,不影響其他IP zuul.ratelimit.policies.e-book-product-provider.type=origin |
4 網關限流參數
七、 zuul性能調優:網關的2層超時調優
1 創建項目
2 修改pom文件添加zuul依賴
<?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> <groupId>com.bjsxt</groupId> <artifactId>zuul-gateway-timeout</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
3 修改配置文件
spring.application.name=zuul-gateway-timeout server.port=9020 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #第一層hystrix超時時間設置 #默認情況下是線程池隔離,超時時間1000ms hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=8000 #第二層ribbon超時時間設置:設置比第一層小 # 請求連接的超時時間: 默認5s ribbon.ConnectTimeout=5000 # 請求處理的超時時間: 默認5s ribbon.ReadTimeout=5000 |
4 超時調優圖解
第六章 分佈式配置中心
(Spring Cloud高級)
一、 爲什麼需要使用配置中心
1 服務配置的現狀
2 常用的配置管理解決方案的缺點
3 爲什麼要使用spring cloud config 配置中心?
4 spring cloud config 配置中心,它解決了什麼問題?
二、 編寫配置中心入門案例
1 編寫配置中心的服務端
1.1 創建項目
1.2 修改pom文件添加config-server座標
<?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> <groupId>com.bjsxt</groupId> <artifactId>config-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
1.3 修改配置文件添加Git地址
spring.application.name=config-server server.port=9050 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #Git配置 spring.cloud.config.server.git.uri=https://gitee.com/oldlu_wk/config #spring.cloud.config.server.git.username= #spring.cloud.config.server.git.password= |
1.4 修改啓動類
@SpringBootApplication @EnableEurekaClient @EnableConfigServer public class ConfigServiceApplication { public static void main(String[] args) { SpringApplication.run(ConfigServiceApplication.class, args); } } |
1.5 創建四個臨時配置文件
config-client.properties e-book=default1.0
config-client-dev.properties e-book=devt1.0
config-client-test.properties e-book=test.0
config-client-prod.properties e-book=prod1.0
1.6 通過配置中心訪問配置文件
1.7 配置文件的命名規則與訪問
2 編寫配置中心的客戶端
2.1 創建一個項目
2.2 修改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> <groupId>com.bjsxt</groupId> <artifactId>config-client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
2.3 修改啓動類
@SpringBootApplication @EnableEurekaClient public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); } } |
2.4 修改配置文件
2.4.1修改配置文件的名稱。客戶端配置文件名稱必須爲bootstrap.properties
2.4.2修改配置文件內容
spring.application.name=config-client server.port=9051 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #默認false,這裏設置true,表示開啓讀取配置中心的配置 spring.cloud.config.discovery.enabled=true #對應eureka中的配置中心serviceId,默認是configserver spring.cloud.config.discovery.serviceId=config-server #指定環境 spring.cloud.config.profile=dev #git標籤 spring.cloud.config.label=master |
2.4.3編寫測試代碼
@SpringBootApplication @EnableEurekaClient public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); } } |
2.4.4測試結果
3 配置中心原理
4 在git端修改配置後,在不重啓服務中如何讓客戶端生效
4.1 創建項目
4.2 修改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> <groupId>com.bjsxt</groupId> <artifactId>config-client-refresh</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
4.3 修改配置文件
spring.application.name=config-client server.port=9051 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #默認false,這裏設置true,表示開啓讀取配置中心的配置 spring.cloud.config.discovery.enabled=true #對應eureka中的配置中心serviceId,默認是configserver spring.cloud.config.discovery.serviceId=config-server #指定環境 spring.cloud.config.profile=dev #git標籤 spring.cloud.config.label=master #springboot 默認開啓了權限攔截 會導致 /refresh出現401,拒絕訪問 management.security.enabled=false |
4.4 刷新請求的url
4.5 需要對讀取配置文件的Bean對象做作用域刷新
@RestController @RefreshScope //刷新作用域 public class ConfigController { @Value("${e-book}") private String msg;
@RequestMapping("/showMsg") public String showMsg(){ return this.msg; } }
|
4.6 創建一個能夠發送post請求的項目
4.7 修改pom文件
<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> <groupId>com.bjsxt</groupId> <artifactId>commons</artifactId> <version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.4</version> </dependency> <!-- log --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies> </project> |
4.8 添加HttpClientUtil工具類
public class HttpClientUtil { public static String doGet(String url, Map<String, String> param) { // 鍒涘緩Httpclient瀵硅薄 CloseableHttpClient httpclient = HttpClients.createDefault(); String resultString = ""; CloseableHttpResponse response = null; try { // 鍒涘緩uri URIBuilder builder = new URIBuilder(url); if (param != null) { for (String key : param.keySet()) { builder.addParameter(key, param.get(key)); } } URI uri = builder.build(); // 鍒涘緩http GET璇鋒眰 HttpGet httpGet = new HttpGet(uri); // 鎵ц璇鋒眰 response = httpclient.execute(httpGet); // 鍒ゆ柇榪斿洖鐘舵?鏄惁涓?00 if (response.getStatusLine().getStatusCode() == 200) { resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (response != null) { response.close(); } httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } return resultString; } public static String doGet(String url) { return doGet(url, null); } public static String doPost(String url, Map<String, String> param) { // 鍒涘緩Httpclient瀵硅薄 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 鍒涘緩Http Post璇鋒眰 HttpPost httpPost = new HttpPost(url); // 鍒涘緩鍙傛暟鍒楄〃 if (param != null) { List<NameValuePair> paramList = new ArrayList<>(); for (String key : param.keySet()) { paramList.add(new BasicNameValuePair(key, param.get(key))); } // 妯℃嫙琛ㄥ崟 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"utf-8"); httpPost.setEntity(entity); } // 鎵цhttp璇鋒眰 response = httpClient.execute(httpPost); resultString = EntityUtils.toString(response.getEntity(), "utf-8"); } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return resultString; } public static String doPost(String url) { return doPost(url, null); }
public static String doPostJson(String url, String json) { // 鍒涘緩Httpclient瀵硅薄 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 鍒涘緩Http Post璇鋒眰 HttpPost httpPost = new HttpPost(url); // 鍒涘緩璇鋒眰鍐呭 StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); httpPost.setEntity(entity); // 鎵цhttp璇鋒眰 response = httpClient.execute(httpPost); resultString = EntityUtils.toString(response.getEntity(), "utf-8"); } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return resultString; }
public static void main(String[] args) { String url ="http://127.0.0.1:9051/refresh"; String info = HttpClientUtil.doPost(url); System.out.println(info); } }
|
4.9 測試
三、 安全與加密
1 使用對稱加密算法,實現敏感數據加密
1.1 什麼是對稱加密(Symmetric encryption)
對稱加密 |
---|
一、對稱加密介紹 |
對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key)。 |
二、檢查加密環境 |
http://127.0.0.1:9050/encrypt/status |
檢查結果:{"description":"No key was installed for encryption service","status":"NO_KEY"} 沒有爲加密服務安裝密鑰。 |
三、設置加密環境3個步驟 |
1.設置祕鑰KEY |
encrypt.key=oldlu |
2.未配置JCE |
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html 下載解壓後,把jar文件上傳到需要安裝jce機器上JDK或JRE的security目錄下,覆蓋源文件即可。 JDK:將兩個jar文件放到%JDK_HOME%\jre\lib\security下 JRE:將兩個jar文件放到%JRE_HOME%\lib\security下 |
3.spring cloud bug |
Dalston.SR4、Dalston.SR3、Dalston.SR2版本不能對配置文件加密,若需要調整到Dalston.SR1 https://github.com/spring-cloud/spring-cloud-config/issues/767 |
四、加密演示 |
加密(post請求):http://127.0.0.1:9030/encrypt 解密(post請求):http://127.0.0.1:9030/decrypt |
1.2 創建項目
1.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> <groupId>com.bjsxt</groupId> <artifactId>config-server-encryption-sym</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
1.4 修改配置文件
spring.application.name=config-server-encryption-sym server.port=9050 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #Git配置 spring.cloud.config.server.git.uri=https://gitee.com/oldlu_wk/config #spring.cloud.config.server.git.username= #spring.cloud.config.server.git.password= #配置密鑰 encrypt.key=oldlu |
1.5 測試
1.6 測試加密與解密
1.6.1加密
1.6.2解密
1.7 創建讀取配置中心配置內容的項目-配置中心客戶端
1.7.1創建項目
1.7.2修改pom文件
<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> <groupId>com.bjsxt</groupId> <artifactId>config-e-book-product-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- 添加product-service座標 --> <dependency> <groupId>com.bjsxt</groupId> <artifactId>e-book-product-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
1.7.3創建bootstrap.properties配置文件
spring.application.name=config-e-book-product-provider server.port=9001 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #配置中心服務端的鏈接信息 #默認false,這裏設置true,表示開啓讀取配置中心的配置 spring.cloud.config.discovery.enabled=true #對應eureka中的配置中心serviceId,默認是configserver spring.cloud.config.discovery.serviceId=config-server-encryption-sym #git標籤 spring.cloud.config.label=master |
1.7.4創建上傳到git遠程倉庫的配置文件 config-e-book-product-provider.properties
#--------------db---------------- mybatis.type-aliases-package=com.book.product.pojo mybatis.mapper-locations=classpath:com/book/product/mapper/*.xml spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/book-product?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull spring.datasource.username={cipher}c3429b5888ff1374922fd4451ecb762c675bd7bd062eff77e9291fde3d466172 spring.datasource.password={cipher}c3429b5888ff1374922fd4451ecb762c675bd7bd062eff77e9291fde3d466172 |
1.7.5將該配置文件上傳到git的遠程倉庫中
1.7.6測試
2 使用非對稱加密算法,實現敏感數據加密
2.1 什麼是非對稱加密(Asymmetric encryption)
2.2 Java-keytool使用說明
2.3 使用非對稱加密算法實現配置文件加密與解密
2.3.1創建配置中心服務端
2.3.1.1 創建項目
2.3.1.2 修改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> <groupId>com.bjsxt</groupId> <artifactId>config-server-rsa</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
2.3.1.3 修改配置文件
spring.application.name=config-server-rsa server.port=9050 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #Git配置 spring.cloud.config.server.git.uri=https://gitee.com/oldlu_wk/config #spring.cloud.config.server.git.username= #spring.cloud.config.server.git.password= #keytool -genkeypair -alias "config-info" -keyalg "RSA" -keystore "encrypt-info.keystore" # keystore文件的路徑 encrypt.key-store.location=classpath:encrypt-info.keystore # alias 指定密鑰對的別名,該別名是公開的; encrypt.key-store.alias=config-info # storepass 密鑰倉庫 encrypt.key-store.password=oldlu123 # keypass 用來保護所生成密鑰對中的私鑰 encrypt.key-store.secret=oldlu456 |
2.3.1.4 通過keytool工具創建密鑰文件
2.3.1.5 測試
2.3.2創建配置中心客戶端
2.3.2.1 創建項目
2.3.2.2 修改pom文件
<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> <groupId>com.bjsxt</groupId> <artifactId>config-product-provider-rsa</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- 添加product-service座標 --> <dependency> <groupId>com.bjsxt</groupId> <artifactId>e-book-product-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
2.3.2.3 修改配置文件
spring.application.name=config-product-provider-rsa server.port=9001 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #配置中心服務端的鏈接信息 #默認false,這裏設置true,表示開啓讀取配置中心的配置 spring.cloud.config.discovery.enabled=true #對應eureka中的配置中心serviceId,默認是configserver spring.cloud.config.discovery.serviceId=config-server-rsa #git標籤 spring.cloud.config.label=master |
2.3.2.4 使用httpUtilClient工具生成加密信息
2.3.2.5 在git的遠程倉庫中創建配置文件
config-product-provider-rsa.properties |
---|
#--------------db---------------- mybatis.type-aliases-package=com.book.product.pojo mybatis.mapper-locations=classpath:com/book/product/mapper/*.xml spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/book-product?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull spring.datasource.username={cipher}AQBdUaIQc5dxL6Px2qQ9cs8DHJ9EkUD2VaAEaGrxiK5y2RKsOJtwL8YozHVeW8bY+A5tdkYNp0wJDYWlCASu2/aNLfSUmzk4yyOKZAUMhrDLcFasRDXQCFE3Eq7JqjPu2hl1AeplZAxl61xFvaJPKzve5/5lXN/gfxT7q41pahb1rzpkZEpqmRAn4+aLfrbamFnYgU/f9s1AsRoRTVrjzxBPe98+VtSbyNAujU8eIf+3ZEVYwDOHOEhFxNUERSBHk/CPrbCBjoU7AygqKC6/dmexwuX/KxQpXUYzh71JPlVhW7LDgCuMs2W//nHdoWSlGmmOy6UZqxzlmg29ktdiRbJJ+LbY6ToDosAe9tfG9cWa1lj9odBwP1bea7VdqK1w4jM= spring.datasource.password={cipher}AQBdUaIQc5dxL6Px2qQ9cs8DHJ9EkUD2VaAEaGrxiK5y2RKsOJtwL8YozHVeW8bY+A5tdkYNp0wJDYWlCASu2/aNLfSUmzk4yyOKZAUMhrDLcFasRDXQCFE3Eq7JqjPu2hl1AeplZAxl61xFvaJPKzve5/5lXN/gfxT7q41pahb1rzpkZEpqmRAn4+aLfrbamFnYgU/f9s1AsRoRTVrjzxBPe98+VtSbyNAujU8eIf+3ZEVYwDOHOEhFxNUERSBHk/CPrbCBjoU7AygqKC6/dmexwuX/KxQpXUYzh71JPlVhW7LDgCuMs2W//nHdoWSlGmmOy6UZqxzlmg29ktdiRbJJ+LbY6ToDosAe9tfG9cWa1lj9odBwP1bea7VdqK1w4jM= |
2.3.2.6 測試配置中心服務端
2.3.2.7 訪問服務測試配置信息是否可用
3 配置中心的用戶安全認證
3.1 創建配置中心服務端開啓安全認證
3.1.1創建項目
3.1.2修改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> <groupId>com.bjsxt</groupId> <artifactId>config-server-encryption-sym-security</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
3.1.3修改配置文件開啓安全認證
spring.application.name=config-server-encryption-sym server.port=9050 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #Git配置 spring.cloud.config.server.git.uri=https://gitee.com/oldlu_wk/config #spring.cloud.config.server.git.username= #spring.cloud.config.server.git.password= #配置密鑰 encrypt.key=oldlu # 安全認證 #開啓基於http basic的安全認證 security.basic.enabled=true security.user.name=user security.user.password=123456 |
3.2 創建配置中心客戶端
3.2.1創建項目
3.2.2修改pom文件
<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> <groupId>com.bjsxt</groupId> <artifactId>config-e-book-product-provider-security</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- 添加product-service座標 --> <dependency> <groupId>com.bjsxt</groupId> <artifactId>e-book-product-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
3.2.3修改配置文件
spring.application.name=config-e-book-product-provider server.port=9001 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #配置中心服務端的鏈接信息 #默認false,這裏設置true,表示開啓讀取配置中心的配置 spring.cloud.config.discovery.enabled=true #對應eureka中的配置中心serviceId,默認是configserver spring.cloud.config.discovery.serviceId=config-server-encryption-sym #git標籤 spring.cloud.config.label=master #安全保護 spring.cloud.config.username=user spring.cloud.config.password=123456 |
3.2.4測試
第七章 消息總線Bus
(Spring Cloud高級)
一、 什麼是Spring Cloud Bus
二、 採用bus實現自動刷新配置信息-Client刷新
1 創建客戶端項目
2 修改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> <groupId>com.bjsxt</groupId> <artifactId>config-client-refresh-bus</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
3 修改配置文件
spring.application.name=config-client server.port=9051 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #默認false,這裏設置true,表示開啓讀取配置中心的配置 spring.cloud.config.discovery.enabled=true #對應eureka中的配置中心serviceId,默認是configserver spring.cloud.config.discovery.serviceId=config-server #指定環境 spring.cloud.config.profile=dev #git標籤 spring.cloud.config.label=master #springboot 默認開啓了權限攔截 會導致 /refresh出現401,拒絕訪問 management.security.enabled=false #消息隊列的鏈接配置 spring.rabbitmq.host=192.168.70.139 spring.rabbitmq.port=5672 spring.rabbitmq.username=oldlu spring.rabbitmq.password=123456 spring.rabbitmq.virtualHost=/ |
4 刷新服務的url
{[/bus/refresh],methods=[POST]}"
5 測試
三、 採用bus實現自動刷新配置信息-Server刷新
1 創建服務端項目
2 修改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> <groupId>com.bjsxt</groupId> <artifactId>config-server-bus</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
3 修改配置文件
spring.application.name=config-server server.port=9050 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #Git配置 spring.cloud.config.server.git.uri=https://gitee.com/oldlu_wk/config #spring.cloud.config.server.git.username= #spring.cloud.config.server.git.password= #springboot 默認開啓了權限攔截 會導致 /refresh出現401,拒絕訪問 management.security.enabled=false spring.rabbitmq.host=192.168.70.139 spring.rabbitmq.port=5672 spring.rabbitmq.username=oldlu spring.rabbitmq.password=123456 spring.rabbitmq.virtualHost=/ |
4 刷新服務的url
{[/bus/refresh],methods=[POST]}
5 測試
四、 局部刷新服務
1 刷新指定服務
http://Config-Server/bus/refresh?destination=需要刷新的服務名稱:端口
2 刷新指定集羣
http://Config-Server/bus/refresh?destination=需要刷新的服務名稱:**
第八章 消息驅動Stream
(Spring Cloud高級)
一、 編寫消息驅動入門案例
1 消息發送者
1.1 創建項目
1.2 修改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> <groupId>com.bjsxt</groupId> <artifactId>stream-sender</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>stream-sender</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
1.3 修改配置文件
spring.application.name=config-server server.port=9050 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #rebbitmq鏈接信息 spring.rabbitmq.host=192.168.70.139 spring.rabbitmq.port=5672 spring.rabbitmq.username=oldlu spring.rabbitmq.password=123456 spring.rabbitmq.virtualHost=/ |
1.4 創建一個發送消息的接口
public interface ISendeService { @Output("oldlu-exchange") SubscribableChannel send(); } |
1.5 修改啓動類
@SpringBootApplication @EnableEurekaClient @EnableBinding(value={ISendeService.class}) public class StreamSenderApplication { public static void main(String[] args) { SpringApplication.run(StreamSenderApplication.class, args); } } |
2 消息接收者
2.1 創建項目
2.2 修改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> <groupId>com.bjsxt</groupId> <artifactId>stream-receiver</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>stream-receiver</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
2.3 修改配置文件
spring.application.name=config-server server.port=9050 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #rebbitmq鏈接信息 spring.rabbitmq.host=192.168.70.139 spring.rabbitmq.port=5672 spring.rabbitmq.username=oldlu spring.rabbitmq.password=123456 spring.rabbitmq.virtualHost=/ |
2.4 創建一個接收消息的接口
public interface IReceiveService { @Input("oldlu-exchange") SubscribableChannel receive(); } |
2.5 創建一個處理消息的類
/** * 處理消息的類 * @author Administrator * */ @Service @EnableBinding({IReceiveService.class}) public class ReceiveService { @StreamListener("oldlu-exchange") public void onReceive(byte[] msg){ //處理消息 System.out.println("Receiver: "+new String(msg)); } } |
2.6 修改啓動類
@SpringBootApplication @EnableEurekaClient @EnableBinding(value={IReceiveService.class}) public class StreamReceiveApplication { public static void main(String[] args) { SpringApplication.run(StreamReceiveApplication.class, args); } } |
3 編寫測試代碼
3.1 創建測試類
@RunWith(SpringRunner.class) @SpringBootTest(classes=StreamSenderApplication.class) public class StreamTest {
@Autowired private ISendeService iSendService;
@Test public void testSend(){ String msg = "OldLu............"; //將消息封裝成Message Message message = MessageBuilder.withPayload(msg.getBytes()).build(); this.iSendService.send().send(message); } }
|
二、 Stream 解決了什麼問題?
三、 Stream的消息分組
1 分組中的消息發送者
1.1 創建項目
1.2 修改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> <groupId>com.bjsxt</groupId> <artifactId>stream-group-sender</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>stream-group-sender</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
1.3 修改配置文件
spring.application.name=stream-group-sender server.port=9050 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #rebbitmq鏈接信息 spring.rabbitmq.host=192.168.70.139 spring.rabbitmq.port=5672 spring.rabbitmq.username=oldlu spring.rabbitmq.password=123456 spring.rabbitmq.virtualHost=/ # 對應 MQ 是 exchange spring.cloud.stream.bindings.outputProduct.destination=exchangeProduct |
1.4 啓動類
@SpringBootApplication @EnableEurekaClient @EnableBinding(value={ISendeService.class}) public class StreamSenderApplication { public static void main(String[] args) { SpringApplication.run(StreamSenderApplication.class, args); } } |
2 分組中的消息接收者
2.1 創建項目
2.2 修改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> <groupId>com.bjsxt</groupId> <artifactId>stream-group-sender</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>stream-group-sender</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
2.3 修改配置文件
spring.application.name=stream-group-receiver server.port=9060 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #rebbitmq鏈接信息 spring.rabbitmq.host=192.168.70.139 spring.rabbitmq.port=5672 spring.rabbitmq.username=oldlu spring.rabbitmq.password=123456 spring.rabbitmq.virtualHost=/ # 對應 MQ 是 exchange spring.cloud.stream.bindings.inputProduct.destination=exchangeProduct # 具體分組 對應 MQ 是 隊列名稱 並且持久化隊列 spring.cloud.stream.bindings.inputProduct.group=groupProduct |
3 測試分組
3.1 消息隊列是否是持久化隊列
3.2 向集羣中發送消息測試
四、 Stream的消息分區
相同消息發送到相同的服務中
1 創建項目
2 修改發送者的配置文件
spring.application.name=stream-group-sender server.port=9050 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #rebbitmq鏈接信息 spring.rabbitmq.host=192.168.70.139 spring.rabbitmq.port=5672 spring.rabbitmq.username=oldlu spring.rabbitmq.password=123456 spring.rabbitmq.virtualHost=/ # 對應 MQ 是 exchange spring.cloud.stream.bindings.outputProduct.destination=exchangeProduct #通過該參數指定了分區鍵的表達式規則 spring.cloud.stream.bindings.outputProduct.producer.partitionKeyExpression=payload #指定了消息分區的數量。 spring.cloud.stream.bindings.outputProduct.producer.partitionCount=2 |
3 修改消費者集羣中的第一個服務的配置文件
spring.application.name=stream-group-receiver server.port=9060 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #rebbitmq鏈接信息 spring.rabbitmq.host=192.168.70.139 spring.rabbitmq.port=5672 spring.rabbitmq.username=oldlu spring.rabbitmq.password=123456 spring.rabbitmq.virtualHost=/ # 對應 MQ 是 exchange spring.cloud.stream.bindings.inputProduct.destination=exchangeProduct # 具體分組 對應 MQ 是 隊列名稱 並且持久化隊列 spring.cloud.stream.bindings.inputProduct.group=groupProduct #開啓消費者分區功能 spring.cloud.stream.bindings.inputProduct.consumer.partitioned=true #指定了當前消費者的總實例數量 spring.cloud.stream.instanceCount=2 #設置當前實例的索引號,從0開始 spring.cloud.stream.instanceIndex=0 |
4 修改消費者集羣中的第二個服務的配置文件
spring.application.name=stream-group-receiver server.port=9061 #設置服務註冊中心地址,指向另一個註冊中心 eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/ #rebbitmq鏈接信息 spring.rabbitmq.host=192.168.70.139 spring.rabbitmq.port=5672 spring.rabbitmq.username=oldlu spring.rabbitmq.password=123456 spring.rabbitmq.virtualHost=/ # 對應 MQ 是 exchange spring.cloud.stream.bindings.inputProduct.destination=exchangeProduct # 具體分組 對應 MQ 是 隊列名稱 並且持久化隊列 spring.cloud.stream.bindings.inputProduct.group=groupProduct #開啓消費者分區功能 spring.cloud.stream.bindings.inputProduct.consumer.partitioned=true #指定了當前消費者的總實例數量 spring.cloud.stream.instanceCount=2 #設置當前實例的索引號,從0開始 spring.cloud.stream.instanceIndex=1 |