后台的微服务和客户端之间都有一个类似于酒店的前台,叫做网关。网关一般有以下作用:
1、统一登录认证,由网关来进行身份认证,调用每个微服务时就不用各自认证了。
2、解决跨越问题,微服务一般是部署在内网中。客户端调用时存在跨域。
3、动态路由和负载均衡,根据请求路径动态分发到不同服务。也可根据服务名进行负载均衡。
4、限流。每个服务自定义限流。
5、监控。网关是微服务的入口,可以监控请求的流量等。
Zuul是Netflix开源的微服务网关,核心是一系列过滤器。这些过滤器可以完成以下功能。
- 是所有微服务入口,进行分发。
- 身份认证与安全。识别合法的请求,拦截不合法的请求。
- 监控。在入口处监控,更全面。
- 动态路由。动态将请求分发到不同的后端集群。
- 压力测试。可以逐渐增加对后端服务的流量,进行测试。
- 负载均衡。也是用ribbon。
- 限流。比如我每秒只要1000次,10001次就不让访问了。
- 服务熔断
新建名为ZuulServer的模块,SpringCloud版本选择Hoxton.SR9,java版本选择java8,SpringBoot版本选择2.3.2.RELEASE。
添加依赖:
<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>
application.properties配置:
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
spring.application.name=zuulserver
server.port=7000
启动类加@EnableZuulProxy注解。
访问http://localhost:7000/consumer/helloByFeign,看到hello,张三,8002。启动Producer模块端口为8000的服务,在访问可以看到负载均衡已生效。默认是使用ribbon做负载均衡。
负载均衡
修改负载均衡策略,在application.properties配置:
producer.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
多访问http://localhost:7000/producer/hello?name=张三
几次,可看到负载均衡策略已生效。
通过服务名配置虚拟主机名
zuul.routes.consumer=/test/**
访问http://localhost:7000/test/helloByFeign看到已生效。
配置自定义映射:
zuul.routes.search.path=/search/**
zuul.routes.search.url=http://www.baidu.com
访问http://localhost:7000/search/,可以看到跳转到了百度首页。
忽略微服务
zuul.ignored-services=producer
访问http://localhost:7000/producer/hello?name=张三
,看到报错。
加前缀
zuul.prefix=/api/v1
访问http://localhost:7000/consumer/helloByFeign
报错,访问http://localhost:7000/api/v1/consumer/helloByFeign
成功。