1、eureka服务搭建省略
2、consume——v1服务的配置
server.port=8087
spring.application.name=consume-server
eureka.instance.hostname=${spring.cloud.client.ip-address}
eureka.client.service-url.defaultZone=http://localhost:8080/eureka
spring.main.allow-bean-definition-overriding=true
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
eureka.instance.metadata-map.version=v2
3、consume——v2服务的配置
server.port=8086
spring.application.name=consume-server
eureka.instance.hostname=${spring.cloud.client.ip-address}
eureka.client.service-url.defaultZone=http://localhost:8080/eureka
spring.main.allow-bean-definition-overriding=true
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
eureka.instance.metadata-map.version=v1
4、zuul服务
pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>io.jmnarloch</groupId>
<artifactId>ribbon-discovery-filter-spring-cloud-starter</artifactId>
<version>2.1.0</version>
</dependency>
配置
server.port=8082
spring.application.name=zuul-server
eureka.instance.hostname=${spring.cloud.client.ip-address}
eureka.client.service-url.defaultZone=http://localhost:8080/eureka
spring.main.allow-bean-definition-overriding=true
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
zuul.routes.consume.path=/consume/**
zuul.routes.consume.serviceId=consume-server
filter
package com.example.zuulserver.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.jmnarloch.spring.cloud.ribbon.support.RibbonFilterContextHolder;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/**
* @author code
* @Date 2021/9/27 17:12
* Description 灰度发布拦截器
* Version 1.0
*/
@Component
public class MyZuulFilter extends ZuulFilter {
/**
* 过滤器的四种类型至一
* pre 在请求之前执行
* route 在路由中执行
* post 在请求后执行
* error 在发生错误的时候执行
* @return
*/
@Override
public String filterType() {
return FilterConstants.ROUTE_TYPE;
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
// 正常的逻辑就是先获取token,在解析token 获取用信息,查看是否已经具备了内测的资格;
// 为了方便演示这里就写死了
String version = request.getParameter("version");
if("v1".equals(version)){
RibbonFilterContextHolder.getCurrentContext().add("version","v1");
}else if("v2".equals(version)){
RibbonFilterContextHolder.getCurrentContext().add("version","v2");
}else {
RibbonFilterContextHolder.getCurrentContext().remove("version");
}
return null;
}
}
5、测试
直接访问——轮询
指定版本v1访问
指定版本v2访问