0%

灰度发布

首先使用Gateway自带的WeightRoutePredicateFactory(权重路由断言工厂)来实现简单的灰度发布需求。
这里用上一章《Spring Cloud -Greenwich SR3(十二):动态路由-Gateway》的代码做示范

权重断言

修改gateway项目的application.yml为:

server:
port: 5432

spring:
application:
name: gdr-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
routes:
- id: gdr-client1
uri: lb://gdr-client1
predicates:
- Path=/gdr-client1/**
filters:
- StripPrefix=1
- id: canary-client-v1
uri: https://www.baidu.com
predicates:
- Path=/canary-client
#权重断言(第一个参数为group(组),第二个参数为weight(权重))(该路由权重为70%)
- Weight=canary-client,70
- id: canary-client-v2
uri: https://www.bing.com
predicates:
- Path=/canary-client
#相同请求权重配置的group(组)必须相同
- Weight=canary-client,30

management:
endpoints:
web:
exposure:
include: info,health,refresh,gateway

重启gateway项目并访问http://localhost:5432/canary-client,在数十次访问之后,可以得出大概符合配置的权重的结论。

阅读全文 »

动态路由

网关(gateway)是整个程序的入口,为了增删路由而反复停止和启动网关有很大可能会造成某个时间段整个程序无法访问的问题,解决办法就是在不重启网关的情况下动态增删路由。

官方实现

在某个需求产生之后的第一反应,应该是去查看官方是否已有实现。
于是通过查看gateway的官网文档https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.0.RC2/reference/html/#retrieving-information-about-a-particular-route,我们找到下面的描述:

The table below summarises the Spring Cloud Gateway actuator endpoints. Note that each endpoint has /actuator/gateway as the base-path.

即支持开启actuator的gateway endpoint,并附上了这个endpoint下面对应的功能表格:

IDHTTP MethodDescription
globalfiltersGETDisplays the list of global filters applied to the routes.
routefiltersGETDisplays the list of GatewayFilter factories applied to a particular route.
refreshPOSTClears the routes cache.
routesGETDisplays the list of routes defined in the gateway.
routes/{id}GETDisplays information about a particular route.
routes/{id}POSTAdd a new route to the gateway.
routes/{id}DELETERemove an existing route from the gateway.

其中我加粗的描述翻译过来分别是“给gateway添加一个新路由”和“从gateway删除一个已存在的路由”,也就是说gateway原生支持动态路由功能(不过只能通过JSON格式的路由来实现)。
同时还给出了一个很有用的JSON格式的路由示例:

{
"id": "first_route",
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/first"}
}],
"filters": [],
"uri": "https://www.uri-destination.org",
"order": 0
}

看到_genkey_0这个不同寻常的参数名称,我们明白从yml到JSON的配置转换应该是有点复杂,接下来再进行具体分析,先新建项目进行测试。

阅读全文 »

Nacos简直太棒了!
阿里🐂🍺!
注册服务速度比Eureka快不说,还添加了注册服务的增删改管理(Eureka必须手动发送DELETE请求到指定服务地址才能删除注册服务),配置中心还解决了Spring Cloud Config本地跑服务修改配置无法自动刷新的问题(因为配置在外网git仓库,除非使用内网穿透),而且Eureka转Nacos极其简单,复杂的服务迁移过程也不会超过五分钟。
简直太强了!!!
微不足道的缺点:没有注册鉴权功能,也就是说任何一个人只要知道你的Nacos注册地址,都可以把他的服务注册进去白嫖

这里用上一章《Spring Cloud -Greenwich SR3(十):授权中心-Spring Cloud Oauth2+JWT》的代码做替换示范(包含注册中心和配置中心)。

Nacos

Nacos官网对Nacos介绍如下:

Welcome to Nacos!
Nacos is committed to help you discover, configure, and manage your microservices. It provides a set of simple and useful features enabling you to realize dynamic service discovery, service configuration, service metadata and traffic management.
Nacos makes it easier and faster to construct, deliver and manage your microservices platform. It is the infrastructure that supports a service-centered modern application architecture with a microservices or cloud-native approach.

欢迎来到 Nacos 的世界!
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

简单来讲官方对Nacos定位就是服务发现、配置及其管理

阅读全文 »

Spring Security

Spring Security的官网介绍对Spring Security描述如下:

Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.
Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements.

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准。
Spring Security是一个框架,致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求。

简单来讲官方对Spring Securuty定位就是身份验证和授权框架。

Oauth2

Oauth2的官网介绍对Oauth2描述如下:

OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 supersedes the work done on the original OAuth protocol created in 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices.

OAuth 2.0是用于授权的行业标准协议。OAuth 2.0取代了在2006年创建的原始OAuth协议上所做的工作。OAuth2.0专注于简化客户端开发人员,同时为Web应用程序,桌面应用程序,移动电话和客厅设备提供特定的授权流。

简单来讲Oauth2就是授权协议
我们这里用Spring Security和Oauth2协议完成权限框架的设计。

阅读全文 »

在某些情况下javax.validation.constraints自带的校验注解(比如常用的@NotNull,@NotEmpty,@Size等)已经不满足我们的需求,这时候就需要创建自定义的Validator来完成入参的校验。
这里我们假设有一个需要根据入参来校验值是否符合枚举的需求(这在实际开发偶尔会遇到),可选的两种方式为根据枚举名称或者枚举值来做校验,基本没区别。这里我们用枚举值来做示例。

首先新建springboot项目名为validator-demo,依赖spring-boot-starter-web和lombok。

阅读全文 »

上一章虽然收集到了日志信息,但是在Zipkin重启之后收集到的日志会直接消失。
所以我们需要将日志信息进行持久化,这样Zipkin会从持久化仓库里面去取日志。可选的组件是Mysql或者Elasticsearch等。因为Mysql持久化太常见了,所以在这里我们选择Elasticsearch(然而同样很常见)。

Elasticsearch

Elasticsearch官网对Elasticsearch描述如下:

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。
通过 Elasticsearch,您能够执行及合并多种类型的搜索(结构化数据、非结构化数据、地理位置、指标),搜索方式随心而变。先从一个简单的问题出发,试试看能够从中发现些什么。找到与查询最匹配的 10 个文档是一回事。但如果面对的是十亿行日志,又该如何解读呢?Elasticsearch 聚合让您能够从大处着眼,探索数据的趋势和模式。

简单来讲可以当作一个分布式的数据库来使用。

阅读全文 »

Spring Cloud Sleuth

Sleuth官网对Sleuth描述如下:

Spring Cloud Sleuth implements a distributed tracing solution for Spring Cloud, borrowing heavily from Dapper, Zipkin and HTrace. For most users Sleuth should be invisible, and all your interactions with external systems should be instrumented automatically. You can capture data simply in logs, or by sending it to a remote collector service.

Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案,大量借用 Dapper、Zipkin 和 HTrace。对于大多数用户,Sleuth 应该是不可见的,并且您与外部系统的所有交互都应自动进行检测。只需在日志中捕获数据,也可以将其发送到远程收集器服务。

简单来讲官方对Sleuth的定位是捕获和发送日志
我们用来和Zipkin结合使用。

阅读全文 »

trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

阅读全文 »