系列5-springCloud微服务--zuul代理实现

1.zuul代理服务配置
步骤1:新建zuul服务模块,修改pom文件,添加如下依赖:
org.springframework.cloud
spring-cloud-starter-zuul
org.springframework.cloud
spring-cloud-starter-eureka
步骤2:修改zuul模块的application.yml文件,添加对如下信息,注册到eureka,添加zuul的路径配置。 ignored-services配置上服务名称后,对应的服务将不能直接访问。当服务名称特别多的情况下,可以用"*"来派至所有的微服务都不能直接访问,只能通过路由访问。 配置routes,此处采用服务ID对应访问路径规则的方式进行配置,也是官方推荐的配置。
server:
port: 8200

eureka:
client:
service-url:
defaultZone: http://ejava:[email protected]:8000/eureka/
spring:
application:
name: springCloud-zuul
zuul:
ignored-services:
"*"
routes:
springCloud-UltraService: /ultraService-proxy/**
可以采用的配置还有
company.path: /ultraService-proxy/**
company.serviceId: springCloud-UltraService
其中的company是逻辑定义字符串。只是为了让path,和serviceId在逻辑上是一组。
如果zuul不想通过eureka访问后端的服务,则路由还可以如下配置:
company.path: /ultraService-proxy/**
company.url: http://localhost:8080/company
但是强烈不建议采用这种配置,因为所有服务的负载均衡处理将会非常麻烦,微服务的后端管理也会很麻烦。
如果需要给所有的微服务访问加上统一的前缀,则可以添加如下配置
zuul:
prefix: ultrapower
步骤3:创建启动类,添加支持zuul的注解
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class,
args);
}
}
步骤4:启动各个服务以及zuul模块,验证是否可以通过zuul的代理访问到数据:
http://localhost:8200 /ultraService-proxy/**
2.zuul安全访问设置(添加路由过滤器)
步骤1:修改zuul模块的pom文件,添加安全认证包依赖:
org.springframework.cloud
spring-cloud-starter-security
步骤2:修改zuul模块,添加过滤器类AuthRequestFilter,继承zuul的过滤器类ZuulFilter,重写如下方法:
public class AuthRequestFilter extends ZuulFilter {

@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();//获取当前请求上下文
String auth ="java:hello";
byte[] encodeAuth = Base64.getEncoder().encode(auth.getBytes(Charset.forName("US-ASCII")));
String header = new String(encodeAuth);
context.addZuulRequestHeader("Authorization", header);
return null;
}

@Override
public boolean shouldFilter() {
return true;
}

@Override
public int filterOrder() {
return 0;
}

@Override
public String filterType() {
return "pre";
}

}
run方法中添加对于访问后端加密后的服务进行安全认证操作。
shouldFilter返回true标识启用过滤器
filterOrder标识过滤级别,返回的数量越大,级别越低。
filterType在zuul进行过滤的时候,可以设置其顾虑执行的位置,:
pre:请求发出之前进行过滤,如果要进行后台服务访问肯定要在请求之前设置头信息。
route:在进行路由请求的时候被调用
post:在路由之后发送请求信息的时候被调用
error:出现错误之后被调用
步骤3:修改zuul模块,建立一个路由配置类ZuulConfig,将自定义的过滤器进行注入。
@Configuration
public class ZuulConfig {
@Bean
public AuthRequestFilter getAuthRequestFilter(){
return new AuthRequestFilter();
}
}
步骤4:修改zuul模块的application.yml配置文件,添加如下配置,则将路由设置为加密访问:
security:
basic:
enabled: true
user:
name: zjava
password: zhello
此时访问路由的路径上需要添加上认证信息或者在请求头中添加认证信息才能通过安全认证进行请求访问。

3.zuul与feign的整合
步骤1:修改feign的接口组件,将原来调用服务名称改为调用路由的代理名称:
@FeignClient(value=" ultraService-proxy ",configuration=FeignClientConfig.class,
fallbackFactory=IDeptClientServiceFallBack.class)
public interface IDeptClientService {
@RequestMapping(method=RequestMethod.GET,value="/dept/sessionId")
public String getSessionId();
@RequestMapping(method=RequestMethod.GET,value="/dept/user")
public UserBean getUser();
}
步骤2:修改feign接口服务配置类,修改安全认证账号密码为zuul的安全认证账号:
@Configuration
public class FeignClientConfig {
@Bean
public Level getLogger(){
return Logger.Level.FULL;
}
@Bean
public BasicAuthRequestInterceptor getBasicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor(" zjava ", " zhello ");
}
}
步骤3:可以将所有服务启动并测试是否可以使用feign通过zuul进行调用后端服务。
4.禁用自定义过滤器
步骤1:只需要修改zuul组件的application.yml文件添加如下配置即可:此时会提示没有 AuthRequestFilter属性,可以忽略
zuul:
AuthRequestFilter:
pre:
disable: true
5.zuul服务降级
步骤1:在zuul中建立fallback回退类,作为服务降级处理类。注意@Component注解一定要添加上。
@Component
public class DeptServiceFallback implements ZuulFallbackProvider {

@Override
public ClientHttpResponse fallbackResponse() {
return new ClientHttpResponse(){

@Override
public InputStream getBody() throws IOException {
//可以设定异常时返回的降级服务信息
return new ByteArrayInputStream("【服务异常的主体内容信息】".getBytes());
}

@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type","text/heml; charset=UTF-8");
return headers;
}

@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.BAD_REQUEST;
}

@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.BAD_REQUEST.value();
}

@Override
public String getStatusText() throws IOException {
return HttpStatus.BAD_REQUEST.getReasonPhrase();
}

@Override
public void close() {
}
};
}

@Override
public String getRoute() {
//设置处理失败的路由
return "ultraService-proxy";
}

}
步骤6:启动所有服务进行测试

你可能感兴趣的:(springCloud学习笔记)