用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

㐅韵味十足的    -  云代码空间

——

SpringCloud分布式微服务云架构 第五篇: 路由网关(zuul)(Finchley版本)

2019-12-12|401阅||

摘要:SpringCloud分布式微服务云架构 第五篇: 路由网关(zuul)(Finchley版本) 在微服务架构中需要几个基础的服务治理组件包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等由这几个基础组件相互协作共同组建了一个简单的微服务系统。一个简答的微

SpringCloud分布式微服务云架构 第五篇: 路由网关(zuul)(Finchley版本)

在微服务架构中需要几个基础的服务治理组件包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等由这几个基础组件相互协作共同组建了一个简单的微服务系统。一个简答的微服务系统如下图å¨è¿ÂéÂÂæÂÂå¥å¾çÂÂæÂÂè¿°

注意A服务和B服务是可以相互调用的作图的时候忘记了。并且配置服务也是注册到服务注册中心的。

 

在Spring Cloud微服务系统中了解springcloud架构可以加求求三五三六二四七二五九一种常见的负载均衡方式是客户端的请求首先经过负载均衡zuul、Ngnix再到达服务网关zuul集群然后再到具体的服务统一注册到高可用的服务注册中心集群服务的所有配置文件由配置服务管理下一篇文章讲述配置服务的配置文件放在git仓库方便开发人员随时改配置。

 

一、Zuul简介

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

 

zuul有以下功能

 

  • Authentication
  • Insights
  • Stress Testing
  • Canary Testing
  • Dynamic Routing
  • Service Migration
  • Load Shedding
  • Security
  • Static Response handling
  • Active/Active traffic management

二、准备工作

继续使用上一节的工程。在原有的工程上创建一个新的工程。

 

三、创建service-zuul工程

其pom.xml文件如下

<?xml version="1.0" encoding="UTF-8"?>  
<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.forezp</groupId>  
    <artifactId>service-zuul</artifactId>  
    <version>0.0.1-SNAPSHOT</version>  
    <packaging>jar</packaging>  
  
    <name>service-zuul</name>  
    <description>Demo project for Spring Boot</description>  
  
    <parent>  
        <groupId>com.forezp</groupId>  
        <artifactId>sc-f-chapter5</artifactId>  
        <version>0.0.1-SNAPSHOT</version>  
    </parent>  
  
    <dependencies>  
        <dependency>  
            <groupId>org.springframework.cloud</groupId>  
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-web</artifactId>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework.cloud</groupId>  
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>  
        </dependency>  
    </dependencies>  
</project>  
在其入口applicaton类加上注解@EnableZuulProxy开启zuul的功能
@SpringBootApplication  
@EnableZuulProxy  
@EnableEurekaClient  
@EnableDiscoveryClient  
public class ServiceZuulApplication {  
  
    public static void main(String[] args) {  
        SpringApplication.run( ServiceZuulApplication.class, args );  
    }  
}  

 加上配置文件application.yml加上以下的配置代码
eureka:  
  client:  
    serviceUrl:  
      defaultZone: http://localhost:8761/eureka/  
server:  
  port: 8769  
spring:  
  application:  
    name: service-zuul  
zuul:  
  routes:  
    api-a:  
      path: /api-a/**  
      serviceId: service-ribbon  
    api-b:  
      path: /api-b/**  
      serviceId: service-feign  


首先指定服务注册中心的地址为http://localhost:8761/eureka/服务的端口为8769服务名为service-zuul以/api-a/ 开头的请求都转发给service-ribbon服务以/api-b/开头的请求都转发给service-feign服务

 

依次运行这五个工程;打开浏览器访问http://localhost:8769/api-a/hi?name=forezp ;浏览器显示

hi forezp,i am from port:8762

 

打开浏览器访问http://localhost:8769/api-b/hi?name=forezp ;浏览器显示

 

hi forezp,i am from port:8762

 

这说明zuul起到了路由的作用

四、服务过滤

zuul不仅只是路由并且还能过滤做一些安全验证。继续改造工程

 

@Component  
public class MyFilter extends ZuulFilter {  
  
    private static Logger log = LoggerFactory.getLogger(MyFilter.class);  
    @Override  
    public String filterType() {  
        return "pre";  
    }  
  
    @Override  
    public int filterOrder() {  
        return 0;  
    }  
  
    @Override  
    public boolean shouldFilter() {  
        return true;  
    }  
  
    @Override  
    public Object run() {  
        RequestContext ctx = RequestContext.getCurrentContext();  
        HttpServletRequest request = ctx.getRequest();  
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));  
        Object accessToken = request.getParameter("token");  
        if(accessToken == null) {  
            log.warn("token is empty");  
            ctx.setSendZuulResponse(false);  
            ctx.setResponseStatusCode(401);  
            try {  
                ctx.getResponse().getWriter().write("token is empty");  
            }catch (Exception e){}  
  
            return null;  
        }  
        log.info("ok");  
        return null;  
    }  
}  

 filterType返回一个字符串代表过滤器的类型在zuul中定义了四种不同生命周期的过滤器类型具体如下

pre路由之前

routing路由之时

post 路由之后

error发送错误调用

filterOrder过滤的顺序

shouldFilter这里可以写逻辑判断是否要过滤本文true,永远过滤。

run过滤器的具体逻辑。可用很复杂包括查sqlnosql去判断该请求到底有没有权限访问。

这时访问http://localhost:8769/api-a/hi?name=forezp 网页显示

 

token is empty

 

访问 http://localhost:8769/api-a/hi?name=forezp&token=22

网页显示

 

hi forezp,i am from port:8762

 

顶 1踩 0收藏
文章评论
共1 条评论 1/1页
发表评论

个人资料

  • 昵称: 㐅韵味十足的
  • 等级: 中级程序员
  • 积分: 455
  • 代码: 0 个
  • 文章: 12 篇
  • 随想: 0 条
  • 访问: 5 次
  • 关注

人气代码

    最新提问

      站长推荐