SpringCloud:高级下篇,服务网关Zuul路由规则性能优化,网关过滤器容错,并发限流,分布式配置中心,安全与加密,消息总线Bus,Client与Server刷新,消息驱动Stream分区分组
接上篇文章:SpringCloud:高级上篇,负载均衡Ribbon及策略,声明式服务调用Feign及性能优化,服务容错保护Hystrix雪崩Feign线程池与信号量隔离RabbitMQ监控,微服务设计模式及项目
SpringCloud高级部分(下篇)
目录
3 启动dashboard-view服务通过可视化界面查看监控数据... 22
3 为什么要使用spring cloud config 配置中心?... 2
4 spring cloud config 配置中心,它解决了什么问题?... 2
4 在git端修改配置后,在不重启服务中如何让客户端生效... 10
二、 采用bus实现自动刷新配置信息-Client刷新... 2
三、 采用bus实现自动刷新配置信息-Server刷新... 5
第五章 服务网关Zuul
(Spring Cloud高级)
一、 什么是网关服务
1 为什么要使用网关
2 网关解决了什么问题
二、 编写网关服务入门案例
1 创建项目
2 修改pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bjsxt</groupId> <artifactId>zuul-gateway</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
3 修改配置文件
spring.application.name=zuul-gateway server.port=9020 #设置服务注册中心地址,指向另一个注册中心 eureka.client.serviceUrl.defaultZone=http://user:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]:8761/eureka/ |
4.4 添加ProviderProductFallback类
/** * 对Provider-Product服务降级处理 * @author Administrator * */ @Component public class ProductProviderFallback implements ZuulFallbackProvider { /** * 当服务无法执行时,该方法返回托底信息 */ @Override public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse() {
/** * 设置响应的头信息 */ @Override public HttpHeaders getHeaders() { HttpHeaders header = new HttpHeaders(); MediaType mt = new MediaType("application","json",Charset.forName("utf-8")); header.setContentType(mt); return header; }
/** * 设置响应体 */ @Override public InputStream getBody() throws IOException { String content = "商品服务不可用,请与管理员联系"; return new ByteArrayInputStream(content.getBytes()); }
/** * ClientHttpResponse的fallback的状态码 返回String */ @Override public String getStatusText() throws IOException { return this.getStatusCode().getReasonPhrase(); }
/** * ClientHttpResponse的fallback的状态码 返回HttpStatus */ @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; }
/** * ClientHttpResponse的fallback的状态码 返回int */ @Override public int getRawStatusCode() throws IOException { return this.getStatusCode().value(); } @Override public void close() { // TODO Auto-generated method stub
} }; } /** * 给定对哪个服务做降级处理 */ @Override public String getRoute() { return "e-book-product-provider"; } } |
六、 在高并发情况下,网关实现限流达到自我保护
1 创建项目
2 修改pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bjsxt</groupId> <artifactId>zuul-gateway-ratelimt</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springcloud-eureka-consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>com.marcosbarbero.cloud</groupId> <artifactId>spring-cloud-zuul-ratelimit</artifactId> <version>1.3.4.RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
|
3 修改配置文件
3.1 全局限流
spring.application.name=zuul-gateway-ratelimit server.port=9020 eureka.client.serviceUrl.defaultZone=http://user:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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:[email protected]:8761/eureka/,http://user:[email protected]: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 |