史上最简单的SpringCloud教程

2023-11-19

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

在这里插入图片描述
注意:A服务和B服务是可以相互调用的,作图的时候忘记了。并且配置服务也是注册到服务注册中心的。

在Spring Cloud微服务系统中,一种常见的负载均衡方式是,客户端的请求首先经过负载均衡(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"&gt;
    <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:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。

这时访问: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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

史上最简单的SpringCloud教程 的相关文章

随机推荐

  • OpenStack rdo一键allinone部署

    目录 1 环境准备 2 配置阿里yum源 3 安装openstack 4 安装packstack软件包 5 执行一键部署命令 6 遇到一些问题 7 登录OpenStack 1 环境准备 CentOS7 最小化安装 设置静态IP 编辑 vi
  • 关于求职及面试的一些小技巧

    关于面试的一些小窍门 内容仅代表我个人观点 欢迎批评指正 之前已经分享过怎么样做一份看起来还算不错的简历了 老司机的分享 写简历的过程中 都有哪些坑 点开即可查看 1 关于面试时机 对相当一部分的部门需求者而言 如果求职者不是绝对的让部门需
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法
  • “大三在读生”都四面成功拿到字节跳动Offer了,你还有什么理由去摸鱼?

    博主大三在读 投的是字节 Data 的后端开发实习生 base 杭州 时间线 4 12 投递 4 13 安排简历筛选 4 14 安排面试 4 19 16 00 一面 4 22 16 00 二面 4 23 8 00 三面 4 23 16 00
  • 在WINDOW 系统下如何用批处理命令生成代码

    如图要实现一个每次编译都会自动重新生成的代码 一般是 软件版本相关的代码最适合这种自动生成 上图中需在用到编译时间和日期 来直接上代码 BEGIN COLOR 07 cls echo off ECHO ECHO 自动生成软件版本号 ECHO
  • Discuz 如何设置SSL类型的SMTP邮箱

    由于国际与国内均对垃圾邮件进行严格管控 我国 互联网信息服务管理办法 中国互联网协会反垃圾邮件规范 均对垃圾邮件进行说明与管理规范 鉴于服务器25端口被大量垃圾邮件充斥 严重影响广大用户正常使用 很多服务器不再提供25端口邮件服务 包括进站
  • QNX系统的ftp调试,连接FTP调试-QNX的PC104调试ftp

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额1元起步 多少随意 锋影 e mail 174176320 qq com 板子上QNX系统ftp的调试 双网卡 IP分别为 192 192 1 10 192 192
  • Qt编程学习笔记

    新建项目 gt 其他项目 gt Empty qmake Project 添加新文件 项目 gt run gt Run in terminal 发现cin gt gt a无法向a输入数据 检查 pro文件发现缺少参数CONFIG consol
  • chrome黑暗模式设置

    1 前言 使用Chrome有很久了 但一直没发现有令人满意的黑暗模式 期间试过通过在谷歌商店中安装黑暗主题 但感觉不好 主要有以下 除了chrome的界面是黑暗模式外 打开其它的页面还是亮模式 我希望黑暗模式支持以下特性 chrome的标签
  • Android ViewPager实现导航页效果

    效果 源码地址 文章翻译自 https www cnblogs com aademeng articles 6238933 html 代码 MainActivity public class MainActivity extends App
  • mysql APPARENT DEADLOCK!!! Complete Status:Managed Threads: 3 (c3p0,druid)

    问题场景 由于在生产环境出现问题 应用挂掉 作为菜鸟运维 解决问题有点忙手忙脚 线上bug修复 重启tomcat 启动报错 错误截图在下面 根据日志分析像是死锁 使用C3P0连接池 tomcat启动完之后 还能正常运行 解决问题经过 网上有
  • v4l2在帧缓冲区预览摄像头

    在应用层通过v4l2 api将采集的摄像头数据yuv转为rgb后写到帧缓冲区达到预览摄像头的目的 程序运行后切换到tty下就可以看到 我的屏幕是bgra格式的 这点要注意 不同屏幕格式不同 不同r g b的偏移通过修改 0x00 lt lt
  • Activiti定时器事件

    定时器事件用于在特定的日期 时间或者周期触发一个事件 它们可以用做开始事件 中间事件 边界事件 边界事件可以是中断的 也可以是非中断的 默认是中断事件 即当触发定时器时 原执行实例会被删除 开始事件定时器 定时器开始事件用于在指定的时间点或
  • 专利检索工具网站分享

    当今有很多专利检索工具可供使用 以下是一些常用的专利检索工具网站 全球专利数据库 https patentscope wipo int search zh search jsf 中国专利数据库 http www pss system gov
  • 爬虫从入门到放弃——开源爬虫框架

    本文参考自知乎 供本人学习使用 作者 老夏 链接 https www zhihu com question 27042168 answer 70821088 目前主流的网络爬虫框架包括但不限于 Nutch Crawler4j WebMagi
  • java yaml配置处理,yaml格式化,yaml节点增加,删除。多yaml合并

    多环境配置文件管理 增加一个配置属性 多套环境配置文件需同时增加 如果忘记了 那么就报错 对多环境配置文件进行管理 使用yaml作为文件时 就涉及到yaml的一些解析 修改 新增操作 java管理yaml 1 环境依赖 2 snakeyam
  • C++基础3:仿函数

    系列文章目录 C 基础 开篇 C 基础1 从const关键字看变量的基础单元 类 C 基础2 构造函数 拷贝构造 赋值运算符重载 文章目录 系列文章目录 前言 一 什么是仿函数 二 实现步骤 1 定义类 2 重载 运算符 3 使用仿函数 4
  • pytorch 2.0初探:和pytorch 1.13的速度对比

    看到pytorch2 0出来了 而且宣传提速明显 一行代码即可提速43 左右 compiled model torch compile model We then measure speedups and validate accuracy
  • tex 表格中内容左对齐/居中/右对齐

    左对齐是l 右对齐是r 居中是c begin table centering caption label tab widgets Notation summary begin tabular l l 就是这里控制每一列的对齐方式 Notat
  • 史上最简单的SpringCloud教程

    在微服务架构中 需要几个基础的服务治理组件 包括服务注册与发现 服务消费 负载均衡 断路器 智能路由 配置管理等 由这几个基础组件相互协作 共同组建了一个简单的微服务系统 一个简答的微服务系统如下图 注意 A服务和B服务是可以相互调用的 作