不惑之年的硬件牛人转到软件自学之spring cloud:(九)实现zuul网关路由

前言:笔者曾经有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代码需求


     





猜你喜欢

转载自blog.csdn.net/weixin_38638578/article/details/80074450
今日推荐