Spring Cloud 实战系列之 Zuul 微服务网关搭建及配置-程序员宅基地

技术标签: spring  java  eureka  ribbon  网关  

前言:博主一直力求做到写博客尽量的详细来减少大家花在踩坑上的时间,若有写的不好或错误的地方,还需各方大佬指正。

一.Zuul网关

网关,是一种网络关口,既然是关口,就需要知道哪些东西能通过哪些东西不能通过。

在微服务中,Zuul是SpringCloud众多组件中的一个,用于微服务的网关。在微服务中,各自服务之间的调用不可能都在各自服务中来实现安全与认证功能,因此需要一个专门的微服务来提供这些功能。当请求从客服端发到服务器,如果经过网关的一系列验证和过滤符合访问要求,那么在之后访问其他微服务或由网关路由转发之后的访问时,不需要再做同样的安全认证。这是网关的主要功能。

实际上,Zuul给我们提供的网关服务种类是很多的。后面会介绍他的一些功能。如果你已经搭建了注册中心那么可以直接看第三节:Zuul服务搭建

二.Zuul服务的前期准备

2.1 注册中心EurekaServer的搭建

为了搭建好网关后,能通过网关来访问各模块微服务来证明网关的搭建成功,因此这里需要提前搭建一些可用的微服务。第一步我们先新建一个Project

选择Springboot作为启动器

,微服务的标配。当然你用Maven

的骨架来搭建也完全可以,构建项目并没有非要用哪一种方式搭建。重要的是后面你知道pom里应该引入那些依赖,application.yml怎么配置。这些才是搭建微服务需要主要的地方。这里我使用Spring Initializr

idea给你默认的内容如下:

Group和Artifact我们已经见得太多了,当我们指定这两个参数时,项目名和包名应该与之适配。不过当然可以不一样。

比如默认值 Group为com.example,Artifact为demo,那么项目名应该为demo和Artifact一致,包名Package应该为com.example.demo,为Group和Artifact的合体 。当然这里不强制,只是一种规范,比如别人看见你的包名为com.example.demo时,立马可以知道他属于com.example组下的demo项目。一些使用语言,Java版本,项目类型啥的。

在这里因为我是作为测试springcloud相关组件的目的,那么我这里设置如下:

细心的朋友会发现,当我们改完1和2,idea会自动给我们修改3和4选项,既然是规范idea当然希望大家准守。改完1和2,我们点击Next。这一步相当于选择这个项目需要的一些组件,比如这个项目你需要用到springmvc?Mybatis?MySQL?那么在这里选择后,idea会去加载这些相关的依赖并在pom里为大家自动引入这些依赖。

这里我们要搭建一些测试的微服务,首先搭建1个Eureka注册中心。所有的微服务都需要在这里注册。

如上图选择Eureka Server,点Next,如下图,项目为zuul,而模组这里我们先搭建微服务的注册中心Eureka Server,所以这里我把模组名命名为eurekaserver,继续点Next。改了模组名,idea会默认在项目目录下建立模组的文件夹,因此可以看见第二个红框自动变化。继续点下一步。

因为我之前有项目所以这里选择开启新的idea窗口。New Window

点击import change之后等待idea加载依赖

查看项目结构:

此时我习惯把application.properties后缀改为yml。这样配置书写的格式符合yml的风格,比较好看。

现在需要做下面几件事,由于我们开始构建项目时选择了Eureka Server,所以pom.xml中不需要手动添加依赖了。

首先在启动类SpringcloudApplication中添加EurekaServer的注解:@EnableEurekaServer

然后在application.yml中添加相关配置:

server:
  port: 9000  #eureka注册中心服务端口
 
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #不向eureka注册中心注册。也就是为了关闭自己向自己注册,eureka默认要向自己注册
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

就可以启动服务了:

访问注册中心:按照配置的端口号访问。我这里配了9000,端口随意,如下图代表Eureka注册中心部署成功了。

显示没有实例在此中心注册。没事接下来我们开始配置zuul网关,它也是一个服务需要注册到此注册中心来。

2.2 EurekaService的搭建

有了注册中心,我们现在需要搭建服务的真正提供者,EurekaService,第四节我们建四个。

eurekaservice01,eurekaservice02,eurekaservice03,eurekaservice04,第一个如下,第二三四个按着第一个的建,修改一下名字,端口号还有方法返回值。

需要用到mvc

服务提供者同样需要注册到注册中心。

改名你懂得

完成:

接下来是同样的套路,改yml,启动类添加注解:@EnableEurekaClient

yml配置如下(因为是测试所有很简陋):

server:
  port: 8900 # 服务提供方
 
# 指定当前eureka客户端的注册地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:9000/eureka/
  instance:
    hostname: localhost
 
#当前服务名称
spring:
  application:
    name: eurekaservice1

注意当前服务名称。这里用于注册到注册中心的名字,还可以启动很多同样为eurekaservice1的名字的微服务到注册中心,zuul从注册中心Eureka Server获取所有服务名为eurekaservice01的服务列表后,会采用负载均衡策略访问其中一台服务提供者获取资源。

下图我们之前zuul中的配置serviceId就是指向这里的服务名称,这是微服务调用的精髓,通过服务名调用。

既然是服务提供者 ,这里要编写controller类了:新建controller包,新建Test01类,编写REST的方法。返回服务1

按照服务提供者1的搭建方式,现在搭建服务提供者2:

同样是新建模组,名字改为...02,yml配置文件中端口号与服务1要不同,服务名称相同,为了测试负载均衡,REST方法返回值设为服务2。

yml:

server:
  port: 8901 # 服务提供方
 
# 指定当前eureka客户端的注册地址,
eureka:
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:9000/eureka/
  instance:
    hostname: localhost
 
#当前服务名称
spring:
  application:
    name: eurekaservice1

同样的方法再建两个服务提供者3和4,服务名称都为eurekaservice2,端口号分别为8902,和8903。REST方法返回值分别为,服务3和服务4。

三.Zuul服务搭建

有了第二节的准备,搭建了注册中心,和服务的提供者,我们现在开始搭建Zuul网关服务,最后通过zuul访问注册中心获取服务列表,然后访问服务提供者。

新建模组:

 这里模组名设为zuul。包名设置为zuul,等会生成的启动类就会是带有zuul了。EurekaServer也可以这样只是我开始搭的时候没有注意到。

需要Eureka的客户端组件,和zuul组件,点next

 模组名设为zuul,不强制

 项目结构:

在启动类配置注解 @EnableEurekaClient,@EnableZuulProxy,@EnableZuulProxy可以称为@EnableZuulServer的增强版,当Zuul与Eureka、Ribbon等组件配合使用时,我们使用@EnableZuulProxy。 

配置pom文件:

启动项目:

聪明的你再去注册中心看就能看见zuul服务已经被注册到注册中心了

有了网关。

四.Zuul的访问

我们有一个网关服务zuul,一个注册中心eurekaserver,4个服务提供者eurekaservice,4个服务提供者,其中两个提供

服务名为eurekaservice1的服务,另外两个提供eurekaservice2的服务,现在我们来启动4个服务提供者,在注册中心查看,并通过网关访问测试网关的服务是否正常。

总项目结构:

启动后注册中心查看:

如之前所想,两个服务名下各两台服务提供者。

现在回想之前zuul的路由配置:

那么我访问zuul网关的test01/**下的任何服务都会给我转发到服务名为eurekaservice1下的01和02服务下。我们来试试

第一次访问:test01

第二次访问:test01

可以看见zuul网关做了转发和负载均衡,使用的是ribbon轮询的方式负载均衡。

那么可以猜想到我们访问test02,zuul网关会在服务名为eurekaservice2的服务3和服务4之间去访问了。我们来看看:

至此我们已经实践完成zuul网关的基本功能转发和负载均衡。第三节会在yml中继续配置一些参数,来实践zuul的更多功能。

作者:Anakki

blog.csdn.net/qq_29519041/article/details/103654564

往期精选  点击标题可跳转

Spring 源码分析(四)容器的基础 XmlBeanFactory(系列文章基于Spring 5.0)

Spring 源码分析(三)容器核心类(系列文章基于Spring 5.0)

Spring 源码分析(二)容器基本用法(系列文章基于Spring 5.0)

Spring 源码分析(一)从基本介绍开始(系列文章基于Spring 5.0)

微软公司将不兼容 IE 的网站自动重定向至 Edge 浏览器

面试官问:MyBatis 日志如何做到兼容所有常用的日志框架?

为什么很多公司强制弃坑 Fastjson 了?主推 Jackson

MySQL 中 delete、truncate、drop 关键字的区别有哪些,该如何选择?

Spring 最常用的 7 大类注解,哪些你还不知道?

Spring Boot 项目中如何更规范的使用 PageHelper 分页插件?

点个赞,就知道你“在看”!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/afreon/article/details/109542079

智能推荐

虚拟机它真的安全吗_虚拟机安全吗-程序员宅基地

虚拟机让我们能够分享主机的资源并提供隔离。在理想的世界中,一个程序运行在虚拟机里,他应该无法影响其他虚拟机。不幸的是,由于技术的限制和虚拟化软件的一些bug,这种理想世界并不存在。在某些情况下,在虚拟机里运行的程序会绕过底层,从而利用宿主机,这种技术叫做虚拟机逃逸技术,由于宿主机的特权地位,其结果是整个安全模型完全崩溃。这也就是说,你在虚拟机上测试病毒、恶意软件,这些东西如果设计好的话,就会通过虚拟机进入你的系统!!!从虚拟机中逃逸 虚拟环境的安全威胁已由理论变为现实从虚拟机中逃逸,一直以来被看作类似于_虚拟机安全吗

linux中 anaconda换清华源-程序员宅基地

conda config --add channels 'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/'conda config --set show_channel_urls yes即可添加 Anaconda Python 免费仓库。运行 conda install numpy测...

【史上最傻瓜的】mac下编译FFmpeg-Android-程序员宅基地

https://github.com/yixia/FFmpeg-Android环境篇1、下载FFmpeg-Android2、安装git3、安装Android ndk4、安装ccache(这个不装会哭的,我编译了半小时,突然说ccache command not found,吐血)命令篇5、$ export ANDROID_

(四)策略梯度(policy gradient)-程序员宅基地

  前面一章表格型方法,进行策略迭代的时候利用到了Q函数。是一种value-base的方法,而之前介绍到还有一种policy-base,本章的就是一种policy-base的方法。  ps:强化学习的目的是寻找最佳策略,value-base相对复杂一点儿,先算价值再找策略。policy-base就是直接寻找策略的。  那有一个大问题就是:==明明已经有了value-base方法,为什么还要去开发policy-base呢?==有什么特殊性吗?当然有了,value-base是有局限性的,只适用于离散动作空间_策略梯度

电商卖车或成趋势,拼多多卖“劳斯莱斯“就是正确的吗?-程序员宅基地

拼多多在卖车这件事可谓专心致志,盯上特斯拉后又盯上劳斯莱斯了。但拼多多一直以来卖的都是低价生活类用品,如今怎么卖上豪车了?其用户有能力买车吗?此外,在天猫与京东都涌入卖车这门生意时,未来电商卖车或也成趋势,那线上卖车会成主流吗?继特斯拉后,拼多多又打起了卖车生意算盘继特斯拉卖车风波后,拼多多又打起了卖车生意算盘。近日,多方媒体报道称,拼多多上一家名为"托海汽车官方旗舰店"店铺开始售卖劳斯莱斯幻影,配置价1068万元,补贴直降122万元后售价约946万元。据悉,该款车型仅需支付99999元

StopWatch 优雅打印执行耗时-程序员宅基地

有时在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,然后这样如果执行大量测试的话就很麻烦,并且不直观,如果想对执行的时间做进一步控制,则需要在程序中很多地方修改,目前spring-framework提供了一个StopWatch类可以做类似任务执行时间控制,也就是封装了一个对开始时间,结束时间记录工具先来看几个示例 统计输出总耗时 import org.springframework.util.StopWatch; ...

随便推点

前端怎样快速入门数据结构和算法?-程序员宅基地

算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。因为开发的过程就是把实际问题转换成计算机可识别的指令..._前端数据算法与结构从哪儿入门

golang捕获http.ResponseWriter被close的两种方式(有无context)-程序员宅基地

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl_http.responsewriter

【转载】一封写给有忧国忧民症状的幼稚知识分子的信-程序员宅基地

我一直觉得,我不应该来到这个世界回忆一下浪费时间浪费食物浪费阳光我并没有创造什么我一直希望解脱解脱确又不甘心于是就这样苟且的或者也许我应该记录下面是拷贝过来我应该认真想想那一个个生命是否真的没有存在的价值--------------------------------------------------------..._知识分子幼稚

matlab基础文档总结_matlab format short是全局还是局部-程序员宅基地

matlab基础文档总结基础知识和符号运算1.局部变量与全局变量将局部变量变为全局变量,在变量前加上关键字“global”,同时最好将变量大写。global PI  BETAPI = 3.1416BETA = 0.01232.数值格式formatformat short;等等3.字符数组1.字符串的链接:(1)横向连接:strcat(2)竖向连接:strvcat2.字符串的替换s = strrep(s1,s2,s3)例如:s1='this a string';s2 = strr_matlab format short是全局还是局部

Fresco使用-程序员宅基地

fresco简单使用先上文档地址:github:https://github.com/facebook/fresco文档:https://frescolib.org/docs/index.html从在github上最好点击英文文档,中文的版本比较旧。1:导入 implementation 'com.facebook.fresco:fresco:2.0.0' // 在 API ..._fresco使用

(三)Docker部署springboot项目_docker spring active-程序员宅基地

上文说过通过容器来创建镜像,这里介绍第二种创建镜像的方式,通过编写Dockerfile文件来创建镜像。上图可以看到的Dockerfile文件是我们自己手动创建的,jdk也是事先上传到此目录下的,下面介绍文件各条内容: 指定基镜像 centos 指定维护者信息 zhaoxin 复制jdk 配置jdk环境这里的docker.io/centos镜像是提..._docker spring active

推荐文章

热门文章

相关标签