前言:笔者曾经有18年的硬件研发经验,从(1)51单片机到(2)FPGA到(3)嵌入式ARM(ARM9到CORTEX A9)全都研发设计过,产品从(1)B超的整机研发到(2)智能家居系统到(3)无线电监测机到(4)平板电脑研发到(5)路灯智能控制到(5)工业电脑均有涉及,从(1)普通的电子技术工程师到(2)副总工程师到(3)副总经理到(4)事业部总经理。。。目前已经步入不惑之年的我对于物联网技术的热衷,决定从硬件开始全面转到物联技术框架之一的spring cloud技术,把我的整个学习经历和大家一起分享,也期待在之后有更多机会和大家一起合作,探讨。
今天是:2018年4月25日 研究主题:实现zuul网关路由
一、zuul网关路由的功能的实现目的
服务管理组件Eureka,负载均衡组件Ribbon等,如果集群提供了API或WEB服务,需要与外部进行通信,那么比较好的解决方式是添加一个网关,将集群的服务都隐藏到网关后面,这样就提升了集群的安全性。
网关将外部的请求过程划分为不同的阶段,每个阶段都提供了一系列的过滤器,这些过滤器可以帮助我们完成以下的功能:
1、身份验证和安全性:对需要身份认证的资源进行过滤,拒绝处理不符合身份认证的请求;
2、观察和监控:跟踪重要的数据,为我们展示准确的请求状况;
3、动态路由:设置每种请求的处理能力,删除那些超出限制的请求;
4、负载分配:设置每种请求的处理能力,删除那些超出限制的请求;
5、静态响应处理:提供一些静态的过滤器,直接响应一些请求,而不将它们转发到集群内部;
6、路由的多样化:除了可以将请求路由到Spring Cloud集群外,还可以将请求路由到其他服务。
OK ,以上讲了很多废话,这些内容是抄录,不是原创,在此申明一下。好了,开始我的原创讲座。
二、搭建一个简单的路由Maven项目
1、新建路由功能的服务,我们将上讲的“cjb-hystrix-dashboard”改为“cjb-zuul-router”
(1)、在pom.xml中增加zuul依赖和httpclient的依赖,如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.demo</groupId> <artifactId>cjb-zuul-router</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>1.5.3.RELEASE</version> </dependency> </dependencies> </project>
(2)、在“MyApplication”主类中增加“@EnableZuulProxy”的注解,并运行于端口:8099上面
package com.example.demo; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @EnableZuulProxy @SpringBootApplication public class MyApplication { public static void main(String[] args) { // 设置启动的服务器端口 new SpringApplicationBuilder(MyApplication.class).properties( "server.port=8099").run(args); } }
2、更改测试客户端“cjb-hystrix-client”为“cjb-zuul-client-test”,这个项目就更改成一个简单的springboot项目跑起来就行,并在访问路径情况下输出简单字符即可。
(1)、“pom.xml”如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.demo</groupId> <artifactId>cjb-zuul-client-test</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.5.4.RELEASE</version> </dependency> </dependencies> </project>
(2)、“application.yml”内容如下:
server: port: 8100 spring: application: name: cjb-zuul-client-test
(3)、访问路径“/cjb”下返回字符“hello zuul”,在“Cjbcontroller”中:
package com.example.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class Cjbcontroller { @RequestMapping(value = "/cjb", method = RequestMethod.GET) public String cjbtest() { return "hello zuul"; } }
3、此时在路由“cjb-zuul-router”中更改“application.yml”中内容改为访问跳转到客户端的端口:8100,但要注意在:zuul->routes之后必须还要加一个路径才行,我临时增加了->hellocjb->url的客户端端口8100
zuul: routes: hellocjb: url: http://localhost:8100
4、以上代码有点乱,我们给一个图就清晰了:
5、以下就是见证奇迹的时候了,我们只访问路由口端及路径/cjb即可转发到这个普通服务里面,访问网页是:http://localhost:8099/hellocjb/cjb
三、在spring cloud中应用zuul功能
1、将“cjb-hystrix-eureka”改成“cjb-zuul-eureka”,跑一个注册中心,这个就不用再慢慢教了哈,在端口8888中运行起来,输入网址:http://localhost:8888/
2、将“cjb-hystrix-server”改为“cjb-zuul-server”作为一个服务提供者,通过访问路径来调用“/person/{persoId}”的返回数据,其他部分基本不做变动,运行在8098端口:输入网址:http://localhost:8098/person/1
3、将“cjb-hystrix-client”改为“cjb-zuul-client”作为一个服务调用者,通过访问路径来调用“/cjbribbon”的返回数据,其他部分基本不做变动,运行在8100端口:输入网址:http://localhost:8100/cjbribbon,通过feign的接口来调用服务提供者的JSON数据:
4、由之前的路由zuul服务“cjb-zuul-router”增加eureka的依赖
(1)、更改“pom.xml”,如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.demo</groupId> <artifactId>cjb-zuul-router</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>1.5.3.RELEASE</version> </dependency> </dependencies> </project>(2)、更改“application.yml”
spring: application: name: cjb-zuul-router eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://localhost:8888/eureka/ zuul: routes: router: path: /router/** serviceId: cjb-zuul-client
里面有个滤波器申明所有的/router/**请求将会被转发到Id为cjb-zuul-service的服务中进行处理,运行端口为:8099,以上更改的部分需要注意两点:第一点:serviceId必须与上面path位置对齐;第二点:serviceId路由必须是跳转到客户端cjb-zuul-client上面才行;下面就是见证奇迹的时候了,输入网址:http://localhost:8099/router/cjbribbon
四、如果需要完整代码的朋友,可以加入作者QQ群:智物联的spring cloud,入群说明:spring cloud代码需求