Zuul快速入门
对Zuul的工作机制有所了解后,下面我们通过一个构建网关的实例快速体验Spring Cloud Zuul的功能。具体步骤如下:
1、 搭建Eureka Server
这里使用2.2.1小节搭建的Spring Boot项目eureka-server作为Eureka Server。
2、 创建提供者服务
(1)使用Spring Initializr方式创建一个提供者项目,这里将Group命名为com.itheima,将Artifact命名为eureka-provider,添加Test、Eureka Client、Web依赖。
(2)引入依赖后,在全局配置文件application.yml进行相关配置,包括配置程序名称、端口号,服务注册地址等,配置后的application.yml代码如例1所示。
例1 eureka-provider\src\main\resources\application.yml
1 spring:
2 application:
3 name: eureka-provider
4 server:
5 port: 7006
6 eureka:
7 client:
8 service-url:
9 defaultZone: http://localhost:7000/eureka
10 instance:
11 hostname: localhost
(3)创建controller包,并在controller包下创建HystrixController类,在HystrixController类中创建一个hi()方法,如例2所示。
例2 eureka-provider\src\main\java\com\itheima\eurekaprovider\controller\HystrixController.java
1 import org.springframework.web.bind.annotation.RequestMapping;
2 import org.springframework.web.bind.annotation.RestController;
3 @RestController
4 public class HystrixController{
5 @RequestMapping("/hi")
6 public String hi(String id){
7 return "hi,访问成功!"+id;
8 }
9 }
(4)在启动类加上@EnableEurekaClient注解,开启Eureka Client功能,具体如例3所示。
例3 eureka-provider\src\main\java\com\theima\eurekaprovider\EurekaProviderApplication.java
1 import org.springframework.boot.SpringApplication;
2 import org.springframework.boot.autoconfigure.SpringBootApplication;
3 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
4 @EnableEurekaClient
5 @SpringBootApplication
6 public class EurekaProviderApplication {
7 public static void main(String[] args) {
8 SpringApplication.run(EurekaProviderApplication.class, args);
9 }
10 }
3、 创建消费者服务
(1)使用Spring Initializr方式创建一个消费者项目,这里将Group命名为com.itheima,将Artifact命名为eureka-consumer,添加Web、Test和Eureka Client依赖。
(2)引入依赖后,在全局配置文件application.yml进行相关配置,包括配置程序名称、端口号,服务注册地址等,配置后的application.yml代码如例4所示。
例4 eureka-consumer\src\main\resources\application.yml
1 spring:
2 application:
3 name: eureka-consumer
4 server:
5 port: 8764
6 eureka:
7 client:
8 service-url:
9 defaultZone: http://localhost:7000/eureka
(3)创建一个config包,在config包下新建配置类RestConfig,并添加@Configuration注解。在RestConfig类中创建一个Bean实例方法RestTemplate(),并在restTemplate()方法上添加@LoadBalanced注解,使 RestTemplate实例对象处理请求时拥有客户端负载均衡的能力,具体如例5所示。
例5 eureka-consumer\src\main\java\com\itheima\eurekaconsumer\config\RestConfig.java
1 import org.springframework.cloud.client.loadbalancer.LoadBalanced;
2 import org.springframework.context.annotation.Bean;
3 import org.springframework.context.annotation.Configuration;
4 import org.springframework.web.client.RestTemplate;
5 @Configuration
6 public class RestConfig{
7 @Bean
8 @LoadBalanced
9 public RestTemplate restTemplate(){
10 return new RestTemplate();
11 }
12 }
(4)创建一个service包,在service包下新建LocalItemService类并添加@Service注解。在LocalItemService类中注入RestTemplate实例对象,并添加一个hi()方法,在hi()方法中对eureka-provider提供者服务进行调用,如例6所示。
例6 eureka-consumer\src\main\java\com\itheima\eurekaconsumer\service\LocalItemService.java
1 import org.springframework.beans.factory.annotation.Autowired;
2 import org.springframework.stereotype.Service;
3 import org.springframework.web.bind.annotation.RequestParam;
4 import org.springframework.web.client.RestTemplate;
5 @Service
6 public class LocalItemService {
7 @Autowired
8 RestTemplate restTemplate;
9 public String hi(@RequestParam(value = "id")String id){
10 return
11 restTemplate.getFor
12 bject("http://eureka-provider/hi?id="+id,
13 String.class);
14 }
15 }
(5)创建一个controller包,在controller包下新建LocalItemController类并添加@RestController注解。在LocalItemController类中注入LocalItemService实例对象,并创建一个hi()方法,如例7所示。
例7 eureka-consumer\src\main\java\com\itheima\eurekaconsumer\controller\LocalItemController.java
1 import com.itheima.eurekaribbonclient.service.LocalItemService;
2 import org.springframework.beans.factory.annotation.Autowired;
3 import org.springframework.web.bind.annotation.GetMapping;
4 import org.springframework.web.bind.annotation.RestController;
5 @RestController
6 public class LocalItemController {
7 @Autowired
8 LocalItemService localItemService;
9 @GetMapping("/hi")
10 public String hi(String id) {
11 return localItemService.hi(id);
12 }
13 }
(6)在启动类加上@EnableEurekaClient注解,开启Eureka Client功能,如例8所示。
例8 eureka-consumer\src\main\java\com\itheima\eurekaconsumer\EurekaConsumerApplication.java
1 import com.itheima.eurekaribbonclient.service.LocalItemService;
2 import org.springframework.beans.factory.annotation.Autowired;
3 import org.springframework.web.bind.annotation.GetMapping;
4 import org.springframework.web.bind.annotation.RestController;
5 @EnableEurekaClient
6 @SpringBootApplication
7 public class EurekaConsumerApplication {
8 public static void main(String[] args) {
9 SpringApplication.run(EurekaConsumerApplication.class, args);
10 }
11 }
4、 创建网关服务
(1)使用Spring Initializr方式构建一个名称为gateway-zuul的网关服务项目,这里将Group命名为com.itheima,将Artifact命名为gateway-zuul,添加Zuul、Test、Eureka Client、Web依赖,其中,Zuul依赖具体如下所示。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
(2)在项目gateway-zuul的启动类GatewayZuulApplication添加@EnableZuulProxy注解开启服务网关Zuul功能,如例9所示。
例9 gateway-zuul\src\main\java\com\itheima\gatewayzuul\GatewayZuulApplication.java
1 import org.springframework.boot.SpringApplication;
2 import org.springframework.boot.autoconfigure.SpringBootApplication;
3 import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
4 @SpringBootApplication
5 @EnableZuulProxy
6 public class GatewayZuulApplication {
7 public static void main(String[] args) {
8 SpringApplication.run(GatewayZuulApplication.class, args);
9 }
10 }
(3)在项目gateway-zuul的全局配置文件application.yml中配置Zuul的相关信息,配置后application.yml文件如例10所示。
例10 gateway-zuul\src\main\resources\application.yml
1 server :
2 port : 8835
3 spring :
4 application :
5 name : gateway-zuul
6 eureka :
7 client :
8 service-url:
9 defaultZone: http://localhost:7000/eureka/
10 zuul: # Zuul配置
11 routes:
12 eureka-consumer:
13 path: /eureka-consumer/** #Zuul路由的前缀
(4)依次启动项目eureka-server,eureka-provider,eureka-consumer,gateway-zuul。启动成功后,使用浏览器访问http://loaclhost:7000
,效果如图1所示。
图1 Eureka Server注册的服务
从图1中可以看出,这里我们访问消费者服务跟之前有所不同,我们需要在访问地址前加上我们在application.yml文件中配置的Zuul路由的前缀/eureka-consumer,这里我们访问http://localhost:8835/eureka-consumer/hi?id=12
,效果如图2所示。
图2 通过Zuul访问服务效果图