环境
  eclipse 4.7
  jdk 1.8
  Spring Boot 1.5.2
  Spring Cloud 1.2

一、接口网关
接口网关:拦截所有的请求,交由接口网关,然后接口网关进行转发,类似nginx反向代理。

二、Zuul
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务, 类似于nginx转发。
zuul默认和Ribbon结合实现了负载均衡的功能。

三、搭建zuul网关工程(eureka client)
1、新建maven工程:service-zuul


2、pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.wjy</groupId>
  6. <artifactId>service-zuul</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <parent>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-parent</artifactId>
  11. <version>1.5.2.RELEASE</version>
  12. <relativePath /> <!-- lookup parent from repository -->
  13. </parent>
  14.  
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  17. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  18. <java.version>1.8</java.version>
  19. </properties>
  20.  
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-eureka</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-zuul</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-web</artifactId>
  33. </dependency>
  34.  
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-starter-test</artifactId>
  38. <scope>test</scope>
  39. </dependency>
  40. </dependencies>
  41.  
  42. <dependencyManagement>
  43. <dependencies>
  44. <dependency>
  45. <groupId>org.springframework.cloud</groupId>
  46. <artifactId>spring-cloud-dependencies</artifactId>
  47. <version>Dalston.RC1</version>
  48. <type>pom</type>
  49. <scope>import</scope>
  50. </dependency>
  51. </dependencies>
  52. </dependencyManagement>
  53.  
  54. <build>
  55. <plugins>
  56. <plugin>
  57. <groupId>org.springframework.boot</groupId>
  58. <artifactId>spring-boot-maven-plugin</artifactId>
  59. </plugin>
  60. </plugins>
  61. </build>
  62.  
  63. <repositories>
  64. <repository>
  65. <id>spring-milestones</id>
  66. <name>Spring Milestones</name>
  67. <url>https://repo.spring.io/milestone</url>
  68. <snapshots>
  69. <enabled>false</enabled>
  70. </snapshots>
  71. </repository>
  72. </repositories>
  73.  
  74. </project>

3、application.yml

  1. eureka:
  2. client:
  3. serviceUrl:
  4. defaultZone: http://localhost:8888/eureka/
  5. server:
  6. port: 8769
  7. spring:
  8. application:
  9. name: service-zuul
  10. zuul:
  11. routes:
  12. api-a:
  13. path: /api-member/**
  14. service-id: service-member
  15. api-b:
  16. path: /api-order/**
  17. service-id: service-order

4、路由转发
启动类需要加@EnableZuulProxy 开启路由转发功能

  1. package com.wjy;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  6. import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
  7.  
  8. @SpringBootApplication
  9. @EnableEurekaClient
  10. @EnableZuulProxy
  11. public class ZuulApp {
  12. public static void main(String[] args) {
  13. SpringApplication.run(ZuulApp.class, args);
  14. }
  15.  
  16. }

修改MemberController:

  1. package com.wjy.controller;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9.  
  10. @RestController
  11. public class MemberController {
  12.  
  13. @Value("${server.port}")
  14. private String serverPort;
  15.  
  16. @RequestMapping("/getUserList")
  17. public List<String> getUserList() {
  18. List<String> listUser = new ArrayList<String>();
  19. listUser.add("zhangsan");
  20. listUser.add("lisi");
  21. listUser.add("wjy");
  22. listUser.add("端口号:"+serverPort);
  23. return listUser;
  24. }
  25.  
  26. @RequestMapping("/getMemberServiceApi")
  27. public String getMemberServiceApi() {
  28. return "this is 会员 服务工程";
  29. }
  30.  
  31. }

修改OrderController:

  1. package com.wjy.controller;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8.  
  9. import com.wjy.service.OrderMemberService;
  10.  
  11. @RestController
  12. public class OrderController {
  13. @Autowired
  14. private OrderMemberService orderMemberService;
  15.  
  16. @RequestMapping("/getOrderUserAll")
  17. public List<String> getOrderUserAll() {
  18. System.out.println("订单服务开始调用会员服务");
  19. return orderMemberService.getOrderUserAll();
  20.  
  21. }
  22.  
  23. @RequestMapping("/getOrderServiceApi")
  24. public String getOrderServiceApi() {
  25. return "this is 订单服务工程";
  26. }
  27. }

测试验证:

发送请求http://127.0.0.1:8769/api-member/getMemberServiceApi转发到http://127.0.0.1:8762/getMemberServiceApi

发送请求http://127.0.0.1:8769/api-order/getOrderServiceApi转发到http://127.0.0.1:8764/getOrderServiceApi

6、服务过滤类:

  1. package com.wjy;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4.  
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.stereotype.Component;
  8.  
  9. import com.netflix.zuul.ZuulFilter;
  10. import com.netflix.zuul.context.RequestContext;
  11.  
  12. @Component
  13. public class MyFilter extends ZuulFilter {
  14.  
  15. private static Logger log = LoggerFactory.getLogger(MyFilter.class);
  16.  
  17. @Override
  18. public String filterType() {
  19. return "pre";
  20. }
  21.  
  22. @Override
  23. public int filterOrder() {
  24. return 0;
  25. }
  26.  
  27. public boolean shouldFilter() {
  28. return true;
  29. }
  30.  
  31. public Object run() {
  32. RequestContext ctx = RequestContext.getCurrentContext();
  33. HttpServletRequest request = ctx.getRequest();
  34. log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
  35. Object accessToken = request.getParameter("token");
  36. String refer = request.getHeader("refer");
  37.  
  38. if (accessToken != null) {
  39. return null;
  40. }
  41. log.warn("token is empty");
  42. ctx.setSendZuulResponse(false);
  43. ctx.setResponseStatusCode(401);
  44. try {
  45. ctx.getResponse().getWriter().write("token is empty");
  46. } catch (Exception e) {
  47. }
  48. return null;
  49.  
  50. }
  51. }

测试验证:

发送请求http://127.0.0.1:8769/api-member/getUserList?token=123456789

发送请求http://127.0.0.1:8769/api-member/getUserList

【Spring Cloud学习之四】Zuul网关的更多相关文章

  1. spring cloud 学习(6) - zuul 微服务网关

    微服务架构体系中,通常一个业务系统会有很多的微服务,比如:OrderService.ProductService.UserService...,为了让调用更简单,一般会在这些服务前端再封装一层,类似下 ...

  2. spring cloud 学习之路由网关(zuul)

    学习自方志朋的博客 http://blog.csdn.net/forezp/article/details/69939114 在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费. ...

  3. spring cloud学习笔记五 网关服务zuul

    网关服务是指,客户端发送的请求不用直接访问特定的微服务接口,而且是经过网关服务的接口进行交互,网关服务再去到特定的微服务中进行调用.   网关服务的路由功能和Nginx的反向代理一样,所有的服务都先会 ...

  4. Spring Cloud(Dalston.SR5)--Zuul 网关-过滤器

    Spring Cloud 为 HTTP 请求的各个阶段提供了多个过滤器,这些过滤器的执行顺序由各自提供的一个 int 值决定,提供的值越小则优先级越高,默认的过滤器及优先级如下: 自定义过滤器 在默认 ...

  5. Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置

    Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作. 简单路由(SimpleHostRoutingFilter) 该过滤器运行后,会将 H ...

  6. Spring Cloud(Dalston.SR5)--Zuul 网关-微服务集群

    通过 url 映射的方式来实现 zuul 的转发有局限性,比如每增加一个服务就需要配置一条内容,另外后端的服务如果是动态来提供,就不能采用这种方案来配置了.实际上在实现微服务架构时,服务名与服务实例地 ...

  7. Spring Cloud(Dalston.SR5)--Zuul 网关

    我们使用 Spring Cloud Netflix 中的 Eureka 实现了服务注册中心以及服务注册与发现:而服务间通过 Ribbon 或 Feign 实现服务的消费以及均衡负载:使用Hystrix ...

  8. Spring Cloud 学习 (五) Zuul

    Zuul 作为路由网关组件,在微服务架构中有着非常重要的作用,主要体现在以下 6 个方面: Zuul, Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能,Zuul 能够将请求 ...

  9. Spring Cloud(Dalston.SR5)--Zuul 网关-Hystrix 回退

    当我们对网关进行配置让其调用集群的服务时,将会执行 Ribbon 路由过滤器,该过滤器在进行转发时会封装为一个 Hystrix 命令予以执行,Hystrix 命令具有容错的功能,如果"源服务 ...

随机推荐

  1. Elasticsearch 待办

    日期格式:yyyy-MM-dd,改为 yyyy-MM-dd HH:mm:ss.SSS:实体类路径:https://github.com/cag2050/spring_boot_elasticsearc ...

  2. CodeChef Tree Palindromes

    Tree Palindromes Given a tree rooted at node 1 with N nodes, each is assigned a lower case latin cha ...

  3. 用mysql实现类似于oracle dblink的功能

      用mysql实现类似于oracle dblink的功能 首先看看有没有federated 引擎. mysql> show engines; +------------+----------+ ...

  4. 【每天学一点Linux】centos7 docker 启动cpu100% 飙升居高不下 无法关机 无法杀死进程

    目前不知道什么原因. 重装了docker后仍然不行.安装方式为yum(在线和本地方式). 后来使用了下载static压缩包的方式来使用,就没有再出现如题的问题了.安装包地址为:https://down ...

  5. Python 鼠标键盘操作

    1.鼠标操作 from pymouse import PyMouse myMouse = PyMouse() #获取当前的鼠标位置 # nowP = myMouse.position() # prin ...

  6. LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays

    原题链接在这里:https://leetcode.com/problems/maximum-sum-of-3-non-overlapping-subarrays/ 题目: In a given arr ...

  7. ssh配置连接远程主机 彻底解放你的双手

    查看ssh支持配置 man ssh_config 打开ssh并配置 vi ~/.ssh/config 基本配置示例说明 密钥文件连接 Host <别名> Port <机器端口号> ...

  8. Ubuntu 14.04 安装python3.7

    下载: https://www.python.org/ftp/python/3.7.4/ .tgz文件,解压后,进入该文件夹 编译./configuremakesudo make install 当 ...

  9. NULL与nullptr

    [https://blog.csdn.net/weixin_40237626/article/details/82560012] 其实啊,在编译器进行解释程序时,NULL会被直接解释成0,所以这里的参 ...

  10. [技术博客]React-Native中的组件加载、卸载与setState问题

    React-Native中的组件加载.卸载与setState问题. Warning: Can only update a mounted or mounting component. This usu ...