SpringCloud搭建一个简单的天气预报系统(四)----集成Zuul

章节目录

  • 1. 前言
  • 2. API网关
    • 2.1 意义
    • 2.2 利与弊
      • 2.2.1 利
      • 2.2.2 弊
    • 2.3 常见的实现方式
  • 3. 集成Zuul
    • 3.1 简介
    • 3.2 如何集成
    • 3.3 天气预报系统集成Zuul
      • 3.3.1 修改“weather-eureka-client”:
      • 3.3.2 修改“weather-report-server”

1. 前言

之前的实现中,已经有了很多的微服务API,如:天气数据API微服务、天气预报API微服务等。每个微服务提供各自的API,其他第三方是通过微服务的名称进行调用,这样的管理是有一个问题-----API没有一个统一的管理。自己想要哪个微服务就调用哪个微服务,没有一个统一的入口。而API网关就是来做一个统一的入口。

2. API网关

2.1 意义

  • 集合多个API
  • 统一API入口

2.2 利与弊

2.2.1 利

  • 避免将内部信息泄露给外部
  • 为微服务添加额外的安全层
  • 支持混合通信协议
  • 降低构建微服务的复杂性
  • 微服务的模拟与虚拟化

2.2.2 弊

  • 在架构上面需要额外考虑更多编排与管理
  • 路由逻辑配置要进行统一的管理
  • 可能引发单点故障

2.3 常见的实现方式

常见的API网关的实现方式:

  • NGINX
  • Zuul
  • Kong(API网关的管理平台)

3. 集成Zuul

3.1 简介

Zuul是Spring Cloud全家桶中的微服务API网关。

所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序。作为一个边界性质的应用程序,Zuul提供了动态路由、监控、弹性负载和安全功能。Zuul底层利用各种filter实现如下功能:

  • 认证和安全:识别每个需要认证的资源,拒绝不符合要求的请求。
  • 性能监测:在服务边界追踪并统计数据,提供精确的生产视图。
  • 动态路由:根据需要将请求动态路由到后端集群。
  • 压力测试:逐渐增加对集群的流量以了解其性能。
  • 负载卸载:预先为每种类型的请求分配容量,当请求超过容量时自动丢弃。
  • 静态资源处理:直接在边界返回某些响应。

3.2 如何集成

这里将“weather-eureka-client”微服务集成Zuul

1)、导入依赖


    org.springframework.cloud
    spring-cloud-starter-netflix-zuul

2)、修改主类
在主类上添加注解@EnableZuulProxy

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableZuulProxy
public class WeatherEurekaClientApplication {

  public static void main(String[] args) {
    SpringApplication.run(WeatherEurekaClientApplication.class, args);
  }
}

3)、修改配置application.yml

spring:
  application:
    name: weather-eureka-client

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

zuul:
  routes:
    # 在本地用什么来映射,比如/cities会映射成本地的/city/cities
    city.path: /city/**
    # 服务名
    city.serviceId: weather-city-server

4)、运行测试
先在IDE中启动“weather-eureka-server”,再在命令行通过指定端口8081来启动“weather-city-server”,最后在IDE中启动“weather-eureka-client”

The bean 'proxyRequestHelper', defined in class path resource [org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration$NoActuatorConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration$EndpointConfiguration.class] and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

Disconnected from the target VM, address: 'javadebug', transport: 'shared memory'

根据报错信息,原因是SpringBoot的版本和SpringCloud的版本不兼容。
解决启动Zuul时报错

再次修改SpringCloud版本:Greenwich.RELEASE

5)、浏览器访问:http://localhost:8080/city/cities

SpringCloud搭建一个简单的天气预报系统(四)----集成Zuul_第1张图片
【注意】:8080端口对应的是“weather-eureka-client”。当以上面的那条连接进行访问时,

3.3 天气预报系统集成Zuul

由于天气预报API微服务依赖于天气数据API微服务和城市数据API微服务。所以,这里改造“weather-report-server”

3.3.1 修改“weather-eureka-client”:

1)、配置网关:

spring:
  application:
    name: weather-eureka-client

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

zuul:
  routes:
    city.path: /city/**
    city.serviceId: weather-city-server
    data.path: /data/**
    data.serviceId: weather-data-server

3.3.2 修改“weather-report-server”

删除之前两个接口,添加一个新接口“DataClient”
SpringCloud搭建一个简单的天气预报系统(四)----集成Zuul_第2张图片
DataClient

@FeignClient("weather-eureka-client")   // API网关
public interface DataClient {
    // 获取城市列表
    @GetMapping("/city/cities")
    List listCity() throws Exception;

    // 根据城市id查询天气数据
    @GetMapping("/data/weather/cityId/{cityId}")
    WeatherResponseVO getDataByCityId(@PathVariable("cityId") String cityId);
}

WeatherReportController

@RestController
@RequestMapping("/report")
@Slf4j
public class WeatherReportController {
    @Autowired
    private DataClient dataClient;

    @GetMapping("/cityId/{cityId}")
    public ModelAndView getReportByCityId(@PathVariable("cityId") String cityId, Model model) throws Exception {
        // 改为由城市数据API微服务提供数据
        List cityList = null;
        ...
}

WeatherReportServiceImpl

@Service
public class WeatherReportServiceImpl implements WeatherReportService {

    @Autowired
    private DataClient dataClient;
    ...
}

先启动Redis + Eurake Server(weather-eureka-server)+启动四个微服务(命令行指定端口)+一个API网关(weather-eureka-client)

启动四个微服务时,注意顺序:

  1. weather-city-server
  2. weather-collection-server
  3. weather-data-server
  4. weather-report-server

访问Eureka Server页面:
SpringCloud搭建一个简单的天气预报系统(四)----集成Zuul_第3张图片
访问天气预报系统:
SpringCloud搭建一个简单的天气预报系统(四)----集成Zuul_第4张图片
城市列表也正常显示SpringCloud搭建一个简单的天气预报系统(四)----集成Zuul_第5张图片
好了,集成Zuul的项目就到这儿吧。

你可能感兴趣的:(SpringCloud)