① 创建Module/microservicecloud-zuul-gateway-9527
pom依赖如下:
<dependencies>
<!-- zuul路由网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<!-- Eureka服务注册 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- actuator监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- hystrix熔断 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- 日常标配 -->
<dependency>
<groupId>com.web.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Boot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<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>
</dependency>
<!-- 热部署插件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
查看spring-cloud-starter-zuul依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-archaius</artifactId>
</dependency>
<dependency>
<groupId>com.netflix.zuul</groupId>
<artifactId>zuul-core</artifactId>
</dependency>
</dependencies>
spring-cloud-starter-hystrix:该依赖用来在网关服务中实现对微服务转发时候的保护机制,通过线程隔离和断路器,防止微服务的故障引发API网关资源无法释放,从而影响其他应用的对外服务。
spring-cloud-starter-ribbon:该依赖用来实现在网关服务进行路由转发时候的客户端负载均衡以及请求重试。
spring-boot-starter-actuator:该依赖用来提供常规的微服务管理端点。另外,在Spring Cloud Zuul中还特别提供了/routes端点来返回当前的所有路由规则。
yml配置文件
server:
port: 9527
spring:
application:
name: microservicecloud-zuul-gateway
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
instance:
instance-id: gateway-9527.com
prefer-ip-address: true
info:
app.name: web-microcloud
company.name: www.web.com
build.artifactId: $project.artifactId$
build.version: $project.version$
hosts文件修改
本地域名解析:
# spring cloud eureka
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
# spring cloud zuul
127.0.0.1 myzuul.com
主启动类如下
@SpringBootApplication
@EnableZuulProxy
public class Zuul_9527_StartSpringCloudApp
{
public static void main(String[] args)
{
SpringApplication.run(Zuul_9527_StartSpringCloudApp.class, args);
}
}
此时整个项目架构如下图:
测试
启动三个服务集群、服务提供者8001和路由9527。
不用路由直接测试:http://localhost:8001/dept/get/1
使用路由测试:http://myzuul.com:9527/microservicecloud-dept/dept/get/1
(默认使用服务名进行跳转)
如对访问http://myzuul.com:9527/microservicecloud-dept/dept/get/1请求进行转发和加固。
修改yml文件
配置对应的path和serviceId,符合/mydept/**规则的请求都会被转发到microservicecloud-dept服务的实例上
zuul:
routes:
mydept.serviceId: microservicecloud-dept
mydept.path: /mydept/**
此时,请求转变为http://myzuul.com:9527/mydept/dept/get/1。
此时将/microservicecloud-consumer-dept-feign启动,测试如下:
此时两种方式都可以访问:
http://myzuul.com:9527/microservicecloud-dept/dept/get/1
http://myzuul.com:9527/mydept/dept/get/1
上面配置方式就是面向服务的路由,根据配置的映射关系,网关将会转发到某个服务的实例上面。如果某个服务有多个实例,Zuul默认使用轮询的负载均衡策略。
当然也可以直接配置url:
zuul:
routes:
mydept.url: http://loclhost:8001/
mydept.path: /mydept/**
该配置定义了发往API网关服务的请求中,所有符合/mydept/**规则的访问都将被路由转发到http://loclhost:8001/地址上。mydept是路由的名字可以任意定义,但是一组path和url映射关系的路由名要相同。不过通常建议使用面向服务的路由。
更简洁的面向服务路由配置
对于面向服务的路由配置,除了使用path与serviceId映射的配置方式之外,还有一种更简洁的配置方式:
zuul.routes.<serviceId>=<path>
其中serviceId指定路由的具体服务名,path用来配置匹配的请求表达式。
zuul:
routes:
mydept.serviceId: microservicecloud-dept
mydept.path: /mydept/**
等价于如下:
zuul.routes.microservicecloud-dept=/mydept/**
服务路由的默认规则
当我们为Spring Cloud Zuul构建的API网关服务引入Spring Cloud Eureka之后,它为Eureka中的每个服务都自动创建一个默认路由规则。这些默认路由规则的path会使用serviceId配置的服务名作为请求前缀。
zuul.routes.microservicecloud-dept.path=/microservicecloud-dept/**
zuul.routes.microservicecloud-dept.serviceId=microservicecloud-dept
由于默认情况下所有Eureka上的服务都会被Zuul自动地创建映射关系来进行路由,这会使得一些我们不希望对外开发的服务也可能被外部访问。这时就需要zuul.ignored-services参数来设置一个服务名匹配表达式来定义不自动创建路由的规则。
如何忽略真实服务名?
zuul:
ignored-services: microservicecloud-dept
routes:
mydept.serviceId: microservicecloud-dept
mydept.path: /mydept/**
zuul:
ignored-services: "*"
routes:
mydept.serviceId: microservicecloud-dept
mydept.path: /mydept/**
zuul:
prefix: /web
ignored-services: "*"
routes:
mydept.serviceId: microservicecloud-dept
mydept.path: /mydept/**
此时http://myzuul.com:9527/mydept/dept/get/1将不可访问,请求转变为http://myzuul.com:9527/web/mydept/dept/get/1。
package com.web.springcloud;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
public class MyZuulFilter extends ZuulFilter {
private static final Logger log = LoggerFactory.getLogger(MyZuulFilter.class);
/**
过滤器具体逻辑
*/
@Override
public Object run() {
// TODO Auto-generated method stub
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
log.info("send {} request to {}",request.getMethod(),request.getRequestURL().toString());
Object accessToken = request.getParameter("accessToken");
if (accessToken==null) {
log.warn("access token is empty");
currentContext.setSendZuulResponse(false);
currentContext.setResponseStatusCode(401);
return null;
}
log.info("access token ok");
return null;
}
/**
判断该过滤器是否需要被执行,这里返回true,将会对所有请求生效
*/
@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() {
// TODO Auto-generated method stub
return "pre";
}
}
@SpringBootApplication
@EnableZuulProxy
public class Zuul_9527_StartSpringCloudApp
{
public static void main(String[] args)
{
SpringApplication.run(Zuul_9527_StartSpringCloudApp.class, args);
}
@Bean
public MyZuulFilter myZuulFilter() {
return new MyZuulFilter();
}
}
20190317145713171.png (68.86 KB, 下载次数: 53)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |