5. zuul
zuul过滤器
https://blog.youkuaiyun.com/u011066470/article/details/106735691
zuul搭建
1. 基本搭建
-
创建新模块zuul
-
导包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
-
在启动器上添加@EnnableZuulProxy
-
yml配置
server: port: 91 eureka: client: service-url: defaultZone: http://eureka-server:8888/eureka spring: application: name: zuul
-
zuul的访问lujing
ip:port/spring.application.name/访问方法
如: localhost:91/user-consumer/alive
2. 负载均衡
启动2个user-consumer,2个user-provider
user-consumer:
controller层
@Autowired
RestService restService;
@Value("${server.port}")
String zuulport;
@RequestMapping("/zuulport")
public String zuulport(){
return "consumer: "+zuulport+" provider: " + restService.restport();
}
restService:
@Service
public class RestService {
@Autowired
RestTemplate restTemplate;
@Autowired
LoadBalancerClient lb;
@HystrixCommand(defaultFallback = "back")
public String restport() {
ServiceInstance instance = lb.choose("user-provider");
return restTemplate.getForObject("http://"+instance.getHost()+":" + instance.getPort() + "/port", String.class);
}
public String back() {
return "RestService -- back";
}
}
user-provider:
controller:
@RestController
public class FeignRibbonController {
@Value("${server.port}")
String port;
@GetMapping("/port")
public String port() {
return "端口:" + port;
}
}
zuul:
通过yml配置均衡策略
# 指定spring.applicaiton.name
user-consumer:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
3. zuul相关的yml配置
路由端点
调试的时候,看网关请求的地址,以及 映射是否正确。网关请求有误时,可以通过此处排查错误。
需导入actuator包
<!-- 上报节点信息 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
配置
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.endpoint.health.enabled=true
management.endpoint.routes.enabled=true
忽略微服务
配置
zuul.ignored-services=user-provider
前缀
zuul.prefix=/api/v1
带上前缀请求
zuul.strip-prefix=false
跳转具体地址
通过ip:port/xx访问
zuul:
route:
xx:
path: /xx/**
url: http://mashibing.com
链路追踪
Sleuth单独
-
pom
每个需要监控的系统
<!-- 引入sleuth依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
测试点:
- 启动eureka,consumer,service
- 访问一次。看日志结果。
[api-driver,1a409c98e7a3cdbf,1a409c98e7a3cdbf,true]
[服务名称,traceId(一条请求调用链中 唯一ID),spanID(基本的工作单元,获取数据等),是否让zipkin收集和展示此信息]
看下游
[service-sms,1a409c98e7a3cdbf,b3d93470b5cf8434,true]
traceId, 是一样的。
服务名必须得写。
zipkin
上面拍错看日志,很原始。刀耕火种,加入利器 zipkin。
zipkin是twitter开源的分布式跟踪系统。
原理收集系统的时序数据,从而追踪微服务架构中系统延时等问题。还有一个友好的界面。
由4个部分组成:
Collector、Storage、Restful API、Web UI组成
采集器,存储器,接口,UI。
原理:
sleuth收集跟踪信息通过http请求发送给zipkin server,zipkin将跟踪信息存储,以及提供RESTful API接口,zipkin ui通过调用api进行数据展示。
默认内存存储,可以用mysql,ES等存储。
操作步骤:
- 每个需要监听的服务的pom中添加。
<!-- zipkin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
- 每个需要监听的服务yml中
spring:
#zipkin
zipkin:
base-url: http://localhost:9411/
#采样比例1
sleuth:
sampler:
rate: 1
- 启动zipkin。
https://zipkin.io
java -jar zipkin.jar
通过http://localhost:9411/访问