Zuul是什么
Zuul包含了对请求的路由和过滤两个最主要的功能:
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础.
Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
注意:Zuul服务最终还是会注册进Eureka
提供=代理+路由+过滤三大功能
Zuul案例
创建eureka
结果图
导入依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</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-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--eureka依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
application.yml文件
server: port: 1001 eureka: client: ##不向服务中心注册自己 register-with-eureka: false ##表明自己是注册中心 fetch-registry: false #配置客户端访问的地址 service-url: defaultZone: http://localhost:1001/eureka instance: #eureka服务端的实例名称 hostname: eureka1001.com
启动类
@SpringBootApplication @EnableEurekaServer //服务注册中心 public class SpringcloudEurekaServerApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudEurekaServerApplication.class, args); } }
效果图
创建生产者
结构图
导入依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</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-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--eureka依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.7.RELEASE</version> </dependency> </dependencies>
application.yml文件
spring: application: #配置服务器名称 name: eureka-provider server: port: 2001 eureka: client: #找到注册中心地址 service-url: defaultZone: http://localhost:1001/eureka
service接口
public interface DoSomeService { public String doSome(); }
serviceImpl接口层
@RestController public class DoServiceImpl implements DoSomeService { @RequestMapping("/doSome") @Override public String doSome() { System.out.println("======doSome======="); return "doSome"; } }
启动类
@SpringBootApplication @EnableEurekaClient public class SpringcloudEurekaProviderApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudEurekaProviderApplication.class, args); } }
效果
创建zuul
结构图
导入依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</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-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--eureka依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> </dependencies>
application.yml
eureka: client: service-url: defaultZone: http://localhost:1001/eureka server: port: 10001 spring: application: name: zuul ##配置zuul网关 zuul: routes: api-a: path: /member-zuul/** service-id: eureka-provider
filter文件
package com.cloud.springcloud_zuul.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Component public class MyZuulFilter extends ZuulFilter { /** * 过滤类型 * @return */ @Override public String filterType() { return "pre"; } /** * 请求过滤顺序 * @return */ @Override public int filterOrder() { return 0; } /** * * @return */ @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { //获取token参数 RequestContext rc = RequestContext.getCurrentContext(); HttpServletRequest request = rc.getRequest(); String token = request.getParameter("token"); if(token!=null){ return null; } //表示不进行路由 rc.setSendZuulResponse(false); rc.setResponseStatusCode(401); try { rc.getResponse().setContentType("text/html;charset=utf-8"); rc.getResponse().getWriter().write("没有传递正确参数,请校验后重试~"); } catch (IOException e) { e.printStackTrace(); } return null; } }
启动类
@SpringBootApplication @EnableEurekaClient @EnableZuulProxy public class SpringcloudZuulApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudZuulApplication.class, args); } }
结果图