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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值