在微服务架构中,网关是必不可少的重要组件。

这关系到了客户端“如何访问”每个服务。

以前主流的方式就是使用Netfilx的Zuul组件。但是,因为某些奇妙的原因,Netfilx全家桶都停止维护了。

我之前也写过Zuul的配置和使用方法:

微服务路由解决方案: “Zuul” 服务搭建;以及自定义Zuul过滤器的代码编写。

Spring Cloud Netflix Zuul 使用自带的 Hystrix 实现回退机制 , 并实现请求在Zuul内部的聚合功能

 

那么,既然Zuul这套东西不维护了,迟早也就是抛弃的份。这时候就到Gateway上场了。

说起Getway的工作流程,大概是这样子的: 客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后最终返回结果。

这么一说…是不是感觉这套流程和 SpringMVC 有点像。这么一看一下子Gateway的流程就感觉铭然于心了有木有。

 

进入正题,开始上手 Spring Cloud Getway 的配置和使用。

当然,路由网关,也是一个项目。

难么必不可少的 项目依赖管理配置文件、应用配置文件、启动类 是肯定需要的。

而他,真的就只需要这几个东西就能完成基本的路由、负载均衡功能。

 

既然要建立项目,pom.xml就是第一个。

Spring Cloud Getway 有一个特别的地方。

那就是他不使用 Web 作为服务器,而是使用 WebFlux 作为服务器。

基于此,那么 spring-boot-starter-web 这依赖就不能上了。

pom.xml完成体如下:

这pom.xml真是又丑又长。我怎么就用了maven没用gradle呢? 不禁陷入了深深的思考

既然是Alibaba体系,那么Sentinel、Nacos等依赖也是需要的。 和之前写过的几个Spring Cloud Alibaba组件的使用结合到一起。

在此之上去掉web依赖,引入 org.springframework.cloud:spring-cloud-starter-gateway 依赖就可以了。

由于过滤器等功能依然需要 Servlet 支持,故这里在依赖一个 javax.servlet:javax.servlet-api

 

 

pom.xml搞定,接下来就是最最最最重要的 application.yml:

 

其他的不说,最主要的是spring.cloud.gateway.route下面的配置。

在这里有几个很重要的点,要重点说一下。

id:  这个是路由ID,值可以随便写,但是一定要保证在整个微服务中此值是唯一的

uri:   lb://是固定写法,表示开启负载均衡。后边跟着的是你注册进nacos的其他服务名字

predicates: 这个是谓词。谓词这个词语一说出来很多人都会蒙圈。但是如果是熟悉JDK1.8的人肯定对这个有印象,Stream API里filter()方法入参就是一个Predicate,返回一个boolean类型的值。虽说Gateway里的和Strean API里的肯定不一样。但是可以这么理解,他是为了判断请求是否满足一个条件而存在的。而我设置的 – Method=GET,POST 表示匹配 GET 和 POST 请求,这俩种类型的请求就可以路由。

 

predicate当然不止Method这一个玩意,他总共有这么些设置:

After | After=2017-01-20T17:42:47.789-07:00[America/Denver]
Before | Before=2017-01-20T17:42:47.789-07:00[America/Denver]
Between | 2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
Cookie | Cookie=chocolate, ch.p
Header | Header=X-Request-Id, \d+
Host | Host=**.somehost.org
Method | Method=GET
Path | Path=/foo/{segment}
Query | Query=baz
RemoteAddr | RemoteAddr=192.168.1.1/24

参考: https://cloud.spring.io/spring-cloud-gateway/2.0.x/single/spring-cloud-gateway.html#gateway-request-predicates-factories

 

 

那么现在

nacos也注册进去了

setinel熔断也开了

路由设置也配好了

还要什么自行车,一个启动类,给他 Run 起来,就可以搞起

 

注意,访问路径是: http://路由网关IP:路由网关Port/服务名/**  (和Zuul一样的)

随便调用个接口,能够成功获取响应就是成功啦!多开几个同样的服务跑起来就会知道,负载均衡也是实现了的。

至此 Spring Cloud Gateway 结合Spring Cloud Alibaba全家桶的路由功能、负载均衡功能已经配置完毕。

阅读全文

 

不要好奇为啥我这博客名字从编码妙妙屋变成了编程小屋。

那是因为我现在正在更新备案,编码妙妙屋这名字不能用,可是我以前的备案就是编码妙妙屋通过的,2019年迷惑行为+1

 

国庆啥都没干,笔记本也没有带回家,就纯玩了7天。太怠惰了,让我心有愧疚。

不过除了国庆假期之外我还是有在好好提升自己的,慢慢的缓缓地,每天都进步一点点。

淘宝工程师写的那本《深入分析 java web 技术内幕》 已经看了一半了,这本书有丶厚,400+页。说收获了什么还说不准,感觉知识并没有那么多,没有我当时看effective java和深入分析jvm的那种感觉。

 

话说我也一直想换下主题,主要是感觉本博客有丶太花里胡哨了,各种控件、图片啥的。我用的是共享虚拟主机,三天两头超出资源限制,有点顶不住。再加上万恶的换页面时歌也会跟着重新加载,让我很难受。

就一直想换个 pjax+极简的那种,就可以在页面跳转时歌曲不会变化,找了很久很久找到一个,不过还不够满足我的需求,所以我在其上进行了二次开发(魔改)

现在也在龟速修改中,至于最后改好了换不换我还不知道,看着来吧,换的代价也挺大的,主要是代码高亮这方面。 龟速修改的主题-> https://github.com/skypyb/pure-sky

阅读全文

说起Feign,那又是老东西了啊

我以前写Netfilx的时候就详细讲过Feign这玩意,其实用起来基本是一样的。

以前的文章地址 : 分布式微服务项目如何使用 Feign 实现声明式 REST 调用,以及自定义 Feign 配置

 

虽说切换到了Alibaba,但是也没啥变化,Feign该怎么用就怎么用,这就不详细说了。主要还是Sentinel

其实Sentinel 和Hystrix在代码里写起来也是一样的

首先肯定是要上pom.xml配置起来。加上对应的依赖。

 

接着写个Feign接口

调用的话就是这样子调用:

 

哎,观察我的NacosHelloFeign类,这里可以看到,我这用了一个fallback回退,这个回退指定的就是Sentinel 的实现,其实写起来和特么的Hystrix一模一样。不得不说SpringCloud这一点是真的做得好。

 

当然,配置肯定是得配置的,他也不会直接就给你用了。

Sentinel 虽说是适配了 Feign 组件。但默认是关闭的。需要在配置文件中配置打开它,在配置文件增加以下代码:

 

其实到现在,整个Feign的使用+熔断限流机制就已经配完了。

不过Sentinel 比起Hystrix真正优越的地方还没来呢。

那就是: 控制台

这个控制台功能丰富、UI好看,比Hystrix那是高到不知道哪里去了。

要是用控制台,又不得不下载代码、打包、编译、运行。

 

所幸,我们有神器docker。我在docker hub 上找了个镜像,直接用就可以了,镜像地址:https://hub.docker.com/r/bladex/sentinel-dashboard

直接执以下命令,将sentinel控制台起开绑到8858端口

 

然后自己的yml文件也得改一下,毕竟都上控制台了,也得把自己这个服务给注册进去。

全部的yml文件如下所示:

可以看到配置里有一个 sentinel.transport.port属性,这个属性的意思是在自己本体这个服务里边,在开个新的端口专门用来和 Sentinel 控制台交互

Sentinel 控制台自身也有,默认端口则是8719

 

到这里就差不多了,所有东西打开,然后就可以访问 http://ip:8858 进入Sentinel 控制台,默认账号密码都是sentinel

有一点还需要注意,那就是为了确保客户端有访问量,Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。意思就是说你一个服务注册进我这来,首先还是看不到的。

你得先经过别人的请求,我才会去监控你,所以在服务刚启动的时候进入Sentinel 控制台找不到自己的服务是很正常的,只要启动时没有报错就不会有问题。

 

 

阅读全文

 

中秋佳节当天,人在异乡,无法和家人团聚,既然如此 不如提升一波自己的姿势水平,免得浪费这假期大好光阴。

说道微服务,现在可不流行Netfilx那一套了, 现在都9102年9月了,Spring Cloud Aliabba都已经孵化完毕,再加上Netfilx将他旗下的项目通通打入冷宫,现在在不学习SpringCloudAlibaba体系就赶不上时代的潮流了。 Netfilx那套体系我都搭过demo 写过博客,各种配置啊注意点啊都挺详细的,感兴趣的可以翻我以前的文章。

 

 

https://github.com/alibaba/spring-cloud-alibaba 这是 SpringCloudAlibaba 的项目 git。

这篇文章主要是开个SpringCloudAliabba篇的头,正式开始SpringCloudAlibaba的学习。

 

 

废话不多说,进入正题。

今天就从微服务最重要的地方开始,当然,也只能从这个地方开始。

那就是服务治理。

 

在 Spring Cloud Netflix 使用的是Eureka,而SpringCloudAlibaba 给我们提供的就是Nacos。

而且,Nacos比Eureka 更加强大,他还可以用来当配置中心。

 

这里我就简单的先完成他基本的职责:服务注册与发现。

首先nacos和Eureka有点不同。

他这个应用。不是我们自己写的,Eureka这个东西他需要我们自己创建一个应用。然后在编写代码,然后再将项目打包,在启动。

Nacos这个东西他和Zipkin有点像,是那种直接下载下来运行就完事了的。

 

我这儿用Docker来运行一个单机的 Nacos 镜像添加到8848端口(默认端口),当然,集群是肯定可以集群的,我这先不玩。

对了,不知道为啥我用网易的docker镜像地址下载会卡住,之后换了alibaba的来下就没问题了。

nacos登陆地址:http://ip:8848/nacos   默认账号密码是nacos/nacos

 

开启Nacos服务完毕后,就要开始写服务提供者和服务消费者了。

其实这俩都差不多,反正注册进服务治理中心了,A可以调用B的服务,自然B也可以调用A的服务,导入的配置也一样,我这就以服务消费者来举例子,避免贴两份基本相同的代码了。

 

我这使用的是最新的版本,要用就用最新的,不然没意思。我之前写的Netflix项目也是使用的最新的,当时用的是SpringCloud F版第三版

现在这个项目用的是SpringCloud G版第三版,SpringBoot 2.1.8.RELEASE

 

先创个依赖项目进行最基本的统一依赖管理

 

这个项目集成了SpringBoot 然后导入了SpringCloud的依赖和SpringCloudAlibaba的依赖。

依赖项目写完之后就是正式开工编写服务。

这个服务就直接继承我刚刚写的依赖项目就可以了。

 

然后在其中,引入web、actuator、test几个SpringBoot依赖。当然还有必不可少的SpringCloudAlibaba Nacos 依赖。

启动类:

 

这个启动类用了个 @EnableDiscoveryClient 这个注解,该注解是SpringCloud内置的,Nacos实现了这个注解,导入了Nacos的依赖的话就代表要注册进Nacos里边。

这样的好处就是以后要是换个新的服务治理中心,代码都不用改就可以轻易的更换,完美符合里式替换原则

 

 

既然能注册进去了,那接着还是老规矩,来个RestTemplate进行远程服务的调用,@LoadBalanced代表负载均衡,这些东西我以前的文章都有讲过啊,这儿就不详细说了。

 

这里就是编写一个控制层,来进行接口对外暴露,内部就是使用RestTemplate+LoadBalancerClient 来进行负载均衡的调用其他服务。

 

当然,yml是肯定要写的。

 

对了,这个management.endpoints 下边端点一定得打开。

因为 SpringCloudAlibaba 的 Nacos 在实现的时候提供了一个 EndPoint, EndPoint 的访问地址为 http://ip:port/actuator/nacos-discovery。

这玩意和服务注册发现息息相关,要是Nacos访问不了这个端点,那你就注册不了。

 

其实到这就差不多了,服务已经可以注册进Nacos里了,然后微服务之间的互相调用也是没有问题的,负载均衡也可以实现。

都没啥好说的,只要学会SpringCloud的思想,组件从一套换成另一套也就几十分钟的时间。

阅读全文

地址:

https://github.com/skypyb/code_demo/tree/master/spring-security-demo

内附 SQL 脚本

 

标准的RBAC权限设计,基于动态查询数据库的权限判定(以接口为粒度,即Request URL+Request Method)、基于JWT的认证授权流程。

当然,以上都是在SpingSecurity下实现的。

 

不得不吐槽一句:

SpingSecurity 真的是 Spring 全家桶中的异端邪教,有丶难用,研究好一段时间看了不少别人写的博客,甚至还打断点看了一些源码才给他理解。

想用这个东西是要学习的 ! 完全无法达到开箱即用的效果。比起这玩意,Spring、SpringMVC、SpringBoot、SpringData 这些一小时就能上手的比他不知道高到哪里去了。

给他写了30+个类,从上周写到这周,提交了20+个 commit 才将基本的认证、授权流程写完

不愧是一堆设计模式狂魔写出来的东西,我佛了

 

 

阅读全文
EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00