SpringCloud:高級下篇,服務網關Zuul路由規則性能優化,網關過濾器容錯,併發限流,分佈式配置中心,安全與加密,消息總線Bus,Client與Server刷新,消息驅動Stream分區分組

接上篇文章:SpringCloud:高級上篇,負載均衡Ribbon及策略,聲明式服務調用Feign及性能優化,服務容錯保護Hystrix雪崩Feign線程池與信號量隔離RabbitMQ監控,微服務設計模式及項目

SpringCloud高級部分(下篇)

目錄

第五章 服務網關Zuul. 1

一、    什麼是網關服務... 2

1      爲什麼要使用網關... 2

2      網關解決了什麼問題... 2

二、    編寫網關服務入門案例... 3

1      創建項目... 3

2      修改pom文件... 3

3      修改配置文件... 5

4      修改啓動類... 5

5      通過網關請求服務... 5

三、    路由器的4種路由規則方法... 5

1      創建項目... 5

2      採用URL指定路由方式... 6

3      採用服務名稱指定路由方式... 6

4      路由的排除方法... 7

5      路由的添加前綴方法... 7

四、    自定義網關過濾器... 8

1      編寫網關過濾器... 8

2      過濾器類型... 11

3      Zuul請求的生命週期... 11

4      採用網關過濾器實現權限驗證... 11

5      網關過濾器執行順序與post類型演示... 15

6      採用網關過濾器對系統異常同一處理... 19

五、    網關容錯... 21

1      zuul和hystrix無縫結合... 21

2      訪問網關服務的數據監控流... 21

3      啓動dashboard-view服務通過可視化界面查看監控數據... 22

4      在網關中實現對服務降級處理... 22

六、    在高併發情況下,網關實現限流達到自我保護... 26

1      創建項目... 26

2      修改pom文件... 26

3      修改配置文件... 28

4      網關限流參數... 30

七、    zuul性能調優:網關的2層超時調優... 30

1      創建項目... 30

2      修改pom文件添加zuul依賴... 30

3      修改配置文件... 32

4      超時調優圖解... 33

第六章 分佈式配置中心... 1

一、    爲什麼需要使用配置中心... 1

1      服務配置的現狀... 1

2      常用的配置管理解決方案的缺點... 1

3      爲什麼要使用spring cloud config 配置中心?... 2

4      spring cloud config 配置中心,它解決了什麼問題?... 2

二、    編寫配置中心入門案例... 2

1      編寫配置中心的服務端... 2

2      編寫配置中心的客戶端... 6

3      配置中心原理... 9

4      在git端修改配置後,在不重啓服務中如何讓客戶端生效... 10

三、    安全與加密... 17

1      使用對稱加密算法,實現敏感數據加密... 17

2      使用非對稱加密算法,實現敏感數據加密... 26

3      配置中心的用戶安全認證... 34

第七章 消息總線Bus. 1

一、    什麼是Spring Cloud Bus. 1

二、    採用bus實現自動刷新配置信息-Client刷新... 2

1      創建客戶端項目... 2

2      修改pom文件... 2

3      修改配置文件... 4

4      刷新服務的url 5

5      測試... 5

三、    採用bus實現自動刷新配置信息-Server刷新... 5

1      創建服務端項目... 5

2      修改pom文件... 5

3      修改配置文件... 7

4      刷新服務的url 8

5      測試... 8

四、    局部刷新服務... 8

1      刷新指定服務... 8

2      刷新指定集羣... 8

第八章 消息驅動Stream.. 1

一、    編寫消息驅動入門案例... 1

1      消息發送者... 1

2      消息接收者... 4

3      編寫測試代碼... 7

二、    Stream 解決了什麼問題?... 8

三、    Stream的消息分組... 9

1      分組中的消息發送者... 9

2      分組中的消息接收者... 12

3      測試分組... 14

四、    Stream的消息分區... 15

1      創建項目... 15

2      修改發送者的配置文件... 15

3      修改消費者集羣中的第一個服務的配置文件... 16

4      修改消費者集羣中的第二個服務的配置文件... 16

第五章 服務網關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());

         }

        

         /**

          * ClientHttpResponsefallback的狀態碼 返回String

          */

         @Override

         public String getStatusText() throws IOException {

            return this.getStatusCode().getReasonPhrase();

         }

        

         /**

          * ClientHttpResponsefallback的狀態碼 返回HttpStatus

          */

         @Override

         public HttpStatus getStatusCode() throws IOException {

            return HttpStatus.OK;

         }

        

         /**

          * ClientHttpResponsefallback的狀態碼 返回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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章