理论知识
1.作用
2.路由
- 将外部请求转发到具体微服务实例上
- 实现外部访问统一入口的基础
3.过滤
4.Zuul与Eureka整合
- Zuul将自身注册到Eureka
- Zuul从Eureka获取其他微服务消息
- 实现微服务的获取都经过Zuul跳转后获取
HelloZuul
1.新建模块microcloud-zuul-9527

2.pom.xml
<!--/routes返回所有路由规则-->
<!--ribbon+hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--zuul需要获取所有服务信息,需要通过eureka客户端访问eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--zuul中依赖actuator,用于监控zuul服务状态-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.application.yml
server:
port: 9527
eureka:
application:
name: microcloud-zuul-1
client:
service-url:
defaultZone: http://eureka1:7001/eureka/,http://eureka2:7002/eureka/,http://eureka3:7003/eureka/
register-with-eureka: true #注册到eureka
fetch-registry: true #获取服务中的注册信息
spring:
application:
name: microcloud-zuul
#开启actuator监控端口
management:
endpoints:
web:
exposure:
include: '*' #'routes'
#zuul服务路由配置
#原来的访问路径:http://localhost:9527/microcloud-provider-dept(小写应用名)/provider/findAll(请求路径)
zuul:
ignored-services: '*' #隐藏所有应用名,不可以直接通过应用名访问,只可通过routes设置的映射访问
routes: #注册服务到zuul
microcloud-provider-dept: /provider
4.启动类
@SpringBootApplication
@EnableZuulProxy
public class ZuulAppConfig {
public static void main(String[] args) {
SpringApplication.run(ZuulAppConfig.class, args);
}
}
Zuul的服务在Feign中生成调用
2.修改microcloud-api
- 目录结构

- DeptZuulService
@FeignClient(name = "MICROCLOUD-ZUUL", fallbackFactory = DeptZuulServiceFallbackFactory.class)
public interface DeptZuulService {
@RequestMapping("/prefix/provider/provider/addDept")
public JsonModel addDept(@RequestBody Dept dept);
@RequestMapping("/prefix/provider/provider/findById/{id}")
public JsonModel findById(@PathVariable("id") Long id);
@RequestMapping("/prefix/provider/provider/findAll")
public JsonModel fingAll();
}
- DeptZuulServiceFallbackFactory
@Component
public class DeptZuulServiceFallbackFactory implements FallbackFactory<DeptZuulService> {
@Override
public DeptZuulService create(Throwable throwable) {
return new DeptZuulService() {
@Override
public JsonModel addDept(Dept dept) {
JsonModel jsonModel = new JsonModel();
jsonModel.setCode(-1);
jsonModel.setData("zuul-消费端端addDept不可用");
return jsonModel;
}
@Override
public JsonModel findById(Long id) {
JsonModel jsonModel = new JsonModel();
jsonModel.setCode(-1);
jsonModel.setData("zuul-消费端端findById不可用");
return jsonModel;
}
@Override
public JsonModel fingAll() {
JsonModel jsonModel = new JsonModel();
jsonModel.setCode(-1);
jsonModel.setData("zuul-消费端端fingAll不可用");
return jsonModel;
}
};
}
}
3.新增microcloud-consumer-dept-zuulfeign-80
- 只是区分microcloud-consumer-dept-feign-80模块,复制一份,下面只出示改变部分
- 目录结构

- 改变controller下的DeptConsumerServlet
@RestController
@RequestMapping("/consumer")
public class DeptConsumerServlet {
@Autowired
private DeptZuulService deptZuulService;
@RequestMapping("/addDept")
public JsonModel addDept(@RequestBody Dept dept) {
return this.deptZuulService.addDept(dept);
}
@RequestMapping("/findById/{id}")
public JsonModel findById(@PathVariable("id") Long id) {
return this.deptZuulService.findById(id);
}
@RequestMapping("/findAll")
public JsonModel fingAll() {
return this.deptZuulService.fingAll();
}
}
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClient
@EnableFeignClients("com.yc.zuul")
public class ZuulFeignConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulFeignConsumerApplication.class, args);
}
}
Zuul过滤器
1.修改microcloud-zuul-9527

2.application.yml
#zuul服务路由配置
#原来的访问路径:http://localhost:9527/microcloud-provider-dept(小写应用名)/provider/findAll(请求路径)
zuul:
ignored-services: '*' #隐藏所有应用名,不可以直接通过应用名访问,只可通过routes设置的映射访问
routes: #注册服务到zuul
#microcloud-provider-dept: /provider
3.AuthorizedRequestFilter
@Component
public class AuthorizedRequestFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
String auth = "product:a";
byte[] encodeAuth = Base64.getEncoder().encode(auth.getBytes(Charset.forName("US-ASCII")));
String authHeader = "Basic" + new String(encodeAuth);
currentContext.addOriginResponseHeader("Authorization", authHeader);
return null;
}
}