一、概念
路由在微服务体系结构的一个组成部分。例如,/可以映射到您的Web应用程序,/api/users映射到用户服务,并将/api/shop映射到商店服务。Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器。
二、通过网关实现反向代理
1、创建ribbon-provider服务,用于提供测试时返回数据
-
配置文件
eureka: instance: #服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除 #注意,EurekaServer一定要设置eureka.server.eviction-interval-timer-in-ms否则这个配置无效,这个配置一般为服务刷新时间配置的三倍 #默认90s lease-expiration-duration-in-seconds: 15 #服务刷新时间配置,每隔这个时间会主动心跳一次 #默认30s lease-renewal-interval-in-seconds: 5 preferIpAddress: true client: #eureka client刷新本地缓存时间 #默认30s registryFetchIntervalSeconds: 5 serviceUrl: defaultZone: http://localhost:8801/eureka/ server: port: 8802 spring: application: name: ribbon-provider
-
启动类文件
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient @ComponentScan public class RibbonApplication { public static void main(String[] args) { SpringApplication.run(RibbonApplication.class, args); } @Bean @LoadBalanced @Autowired RestTemplate restTemplate(){ return new RestTemplate(); } }
-
controller层
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/index") public String index() { return "aaaaaa"; } }
2、创建zuul网关服务
-
引入jar包
<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>
-
配置文件
server: port: 8004 spring: application: name: Zuul eureka: client: service-url: defaultZone: http://localhost:8801/eureka/ management: security: enabled: false zuul: routes: ribbon-provider: /client/** #重写微服务的访问路径 ignored-patterns: /ribbon-*/** #忽略指定的微服务 #添加这项配置之后表示不可以通过访问服务名 #http://localhost:8004/ribbon-provider/index访问, #但能通过重写的路径http://localhost:8004/client/index访问
更多zuul相关配置参照zuul的官方中文文档:https://www.springcloud.cc/spring-cloud-dalston.html#_router_and_filter_zuul
-
使用@EnableZuulProxy注释Spring Boot主类,并将本地调用转发到相应的服务
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
-
启动ribbon-provider服务(之前已经创建好的ribbon服务),在启动zuul服务
-
正常访问ribbon-provider服务http://localhost:8802/index,再通过网关服务访问http://localhost:8004/client/index,可以看到相同的返回结果
-
这样,我们通过网关访问ribbon-provider服务,避免了直接去访问ribbon-provider服务器,实现了反向代理的功能
三、实现负载均衡
- 再次创建一个ribbon-provider2服务项目(参照上面的创建方式),修改页面的返回值,配置文件中服务名相同,端口号不同
- 然后我们去http://localhost:8801/ eureka管理中心就会发现ribbon-provider服务下有两个可访问的端口
Application | AMIs | Availability Zones | Status |
---|---|---|---|
RIBBON-PROVIDER | n/a (2) | (2) | UP (2) - D-V9042MTV-0919.hz.ali.com:ribbon-provider:8802 , D-V9042MTV-0919.hz.ali.com:ribbon-provider:8808 |
ZUUL | n/a (1) | (1) | UP (1) - D-V9042MTV-0919.hz.ali.com:Zuul:8004 |
- 最后通过网关访问http://localhost:8004/client/index,多次访问之后会发现页面会交替展示两个服务的返回结果