目录

一 网关

1 背景介绍

2 网关定义

2.1 Spring Cloud Gateway优缺点分析

3 网关的入门步骤

3.1 业务需求

3.2 01-sca父工程下创建sca-gateway子模块(module)

3.3 添加相关配置文件信息

3.4 创建启动类

3.5 启动项目进行访问测试

4 网关基础面试

二 负载均衡设计

1 为什么需要负载均衡

2 Gateway中负载均衡实现?

2.1 项目中添加服务发现依赖

2.2 修改网关的配置文件

2.3 启动服务,进行访问测试,并反复刷新分析

3 执行流程分析(重要)

4 网关负载均衡 的面试点

三 断言(Predicate)增强分析(了解)

1 Predicate 介绍

2 Predicate 内置工厂

2.1 基于Datetime类型的断言工厂

2.2 基于header的断言工厂HeaderRoutePredicateFactory

2.3 基于Method请求方法的断言工厂

2.4 基于Query请求参数的断言工厂,QueryRoutePredicateFactory

3 Predicate 应用案例实践

4 谓词的面试点

四 过滤器(Filter)增强分析(了解)

1 描述

2 局部过滤器设计及实现

2.1 基于AddRequestHeaderGatewayFilterFactory,为原始请求添加Header。

2.2 基于AddRequestParameterGatewayFilterFactory,为原始请求添加请求参数及值

2.3 基于PrefixPathGatewayFilterFactory,为原始的请求路径添加一个前缀路径

2.4 基于RequestSizeGatewayFilterFactory,设置允许接收最大请求包的大小

3 全局过滤器设计及实现

3.1 带参数的过滤器方式

3.2 前缀白名单的过滤器方式

4 网关过滤器的面试题

五 限流设计及实现

1 限流概述

2 限流快速入门

2.1 添加依赖

2.2 添加sentinel及路由规则(假如已有则无需设置)

2.3 启动网关项目,检测sentinel控制台的网关菜单

2.4 在sentinel面板中设置限流策略

2.5 通过url进行重复访问检测是否实现了限流操作

3 基于请求属性限流

4 自定义API维度限流(重点)

4.1 新建API分组

4.2 新建分组流控规则

4.3 进行访问测试,如图所示

5 自定义流控网关返回值

6 流控网关的面试题

六 总结(Summay)

1 重难点

2 FAQ

3 该知识点会出现的bug


一 网关

1 背景介绍

我们知道,一个大型系统在设计时,经常会被拆分为很多个微服务。那么作为客户端要如何去调用 这么多的微服务呢?客户端可以直接向微服务发送请求,每个微服务都有一个公开的URL,该URL可以直接映射到具体的微服务,如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的架构,会存在着诸多的问题,例如,客户端请求不同的微服务可能会增加客户端代码或配置的复杂性。还有就是每个服务,在调用时都需要独立认证。并且存在跨域请求,也在一定程度上提高了代码的复杂度。基于微服务架构中的设计及实现上的问题,为了在项目中简化前端的调用逻辑,同时也简化内部服务之间互相调用的复杂度,更好保护内部服务,提出了网关的概念。

2 网关定义

网关本质上要提供一个各种服务访问的入口,并提供服务接收并转发所有内外部的客户端调用,还有就是权限认证,限流控制等等。Spring Cloud Gateway是Spring公司基于Spring 5.0,Spring Boot 2.0 和 等技术开发的一个网关组件,它旨在为微服务架构提供一种简单有效的统一的 API入口,负责服务请求路由、组合及协议转换,并且基于 Filter 链的方式提供了权限认证,监控、限流等功能。

网关是将两个使用不同传输协议的网络段连接在一起的设备,网关一般用作网络的入口和出口点,因为所有数据必须在路由之前通过或与网关通信。在大多数基于IP的网络中,唯一不通过至少一个网关的流量是在同一局域网(LAN)段上的节点之间流动的流量。

在个人或企业场景中使用网关的主要优点是将互联网连接简化为一个设备。在企业中,网关节点还可以充当代理服务器和防火墙。

2.1 Spring Cloud Gateway优缺点分析

1) 优点:

  1. 性能强劲:是第一代网关Zuul的1.6倍。
  2. 功能强大:内置了很多实用的功能,例如转发、监控、限流等
  3. 设计优雅,容易扩展。

2) 缺点:

  1. 依赖Netty与WebFlux(Spring5.0),不是传统的Servlet编程模型(Spring MVC就是基于此模型实现),学习成本高。
  2. 需要Spring Boot 2.0及以上的版本,才支持

3 网关的入门步骤

3.1 业务需求

通过网关作为服务访问入口,对系统中的服务进行访问,例如通过网关服务去访问sca-provider服务.

3.2 01-sca父工程下创建sca-gateway子模块(module)

pom.xml文件添加网关依赖:

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

注意:依赖下载失败的原因分析:

  1. 保证网络没有问题(手机网络,公司网络)
  2. 保证maven配置正确(maven软件,远程仓库)
  3. 本地库:尽量不用存在同一个资源的多个版本

3.3 添加相关配置文件信息

server:port: 9000
spring:application:name: sca-gatewaycloud:gateway:routes:routes: #配置网关路由规则- id: route01  #路由id,自己指定一个唯一值即可uri: http://localhost:8081/ #网关帮我们转发的urlpredicates: ###断言(谓此):匹配请求规则- Path=/nacos/provider/echo/**  #请求路径定义,此路径对应uri中的资源filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos

其中:路由(Route) 是 gateway 中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面的几个信息:

  1. id,路由标识符,唯一性,区别于其他 Route。
  2. uri,路由指向的目的地 uri,即客户端请求最终被转发到的微服务。
  3. predicates,断言(谓词)的作用是进行条件判断,只有断言都返回真,才会执行路由。
  4. filter,过滤器用于修改请求和响应信息。
  5. 注意格式,否则无法启动网关!!!!

3.4 创建启动类

package com.jt;@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);}
}

3.5 启动项目进行访问测试

依次启动sca-provider,sca-gateway服务,然后打开浏览器,进行访问测试,例如:

最后一个9000只是一个临时参数.

4 网关基础面试

  1. 什么是网关?服务访问(流量)的一个入口,类似生活中的“海关“
  2. 为什么使用网关?(服务安全,统一服务入口管理,负载均衡,限流,鉴权)
  3. Spring Cloud Gateway 应用的初始构建过程(添加依赖,配置)
  4. Gateway 服务的启动底层是通过谁去实现的?(Netty网络编程框架-ServerSocket)
  5. Gateway 服务做请求转发时一定要在注册中心进行注册吗?(不一定,可以直接通过远端url进行服务访问)

二 负载均衡设计

1 为什么需要负载均衡

网关才是服务访问的入口,所有服务都会在网关层面进行底层映射,所以在访问服务时,要基于服务serivce id(服务名)去查找对应的服务,让请求从网关层进行均衡转发,以平衡服务实例的处理能力。

2 Gateway中负载均衡实现?

2.1 项目中添加服务发现依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.2 修改网关的配置文件

server:port: 9000
spring:application:name: sca-gatewaycloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: true  #开启通过服务注册中心的serviceId创建路由routes:- id: route01##uri: http://localhost:8081/uri: lb://sca-provider # lb为服务前缀,不能随意写predicates: ###匹配规则- Path=/nacos/provider/echo/**filters:- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos

其中,lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略。

同时建议开发阶段打开gateway日志,代码如下:

logging:level:org.springframework.cloud.gateway: debug

2.3 启动服务,进行访问测试,并反复刷新分析

启动两个不同端口号的服务提供方(sca-provider)服务器,再启动网关服务器

3 执行流程分析(重要)

客户端向Spring Cloud Gateway发出请求。

如果Gateway Handler Mapping 通过断言predicates(predicates)的集合确定请求与路由(Routers)匹配,则将其发送到Gateway Web Handler。

Gateway Web Handler 通过确定的路由中所配置的过滤器集合链式调用过滤器(也就是所谓的责任链模式)。

Filter由虚线分隔的原因是, Filter可以在发送代理请求之前和之后运行逻辑。

处理的逻辑是 在处理请求时 排在前面的过滤器先执行,而处理返回相应的时候,排在后面的过滤器先执行。

4 网关负载均衡 的面试点

三 断言(Predicate)增强分析(了解)

1 Predicate 介绍

Predicate(断言)又称谓词,用于条件判断,只有断言结果都为真,才会真正的执行路由。断言其本质就是定义路由转发的条件.

2 Predicate 内置工厂

SpringCloud Gateway包括一些内置的断言工厂,所有这些断言都与http请求的不同属性相匹配,具体如下:

2.1 基于Datetime类型的断言工厂

此类型的断言根据时间做判断,主要有三个:

1) AfterRoutePredicateFactory:判断请求日期是否晚于指定日期
2) BeforeRoutePredicateFactory:判断请求日期是否早于指定日期
3) BetweenRoutePredicateFactory:判断请求日期是否在指定时间段内

而, - After=2020-12-31T23:59:59.789+08:00[Asia/Shanghai]

当且仅当请求时的时间After配置的时间时,才转发该请求,若请求时的时间不是After配置的时间时,则会返回404 not found。时间值可通过ZonedDateTime.now()获取。

2.2 基于header的断言工厂HeaderRoutePredicateFactory

判断请求Header是否具有给定名称且值与正则表达式匹配。例如:

- Header=X-Request-Id, \d+

2.3 基于Method请求方法的断言工厂

MethodRoutePredicateFactory接收一个参数,判断请求类型是否跟指定的类型匹配。例如:

- Method=GET

2.4 基于Query请求参数的断言工厂,QueryRoutePredicateFactory

接收两个参数,请求param和正则表达式, 判断请求参数是否具 有给定名称且值与正则表达式匹配。例如:

- Query=pageSize,\d+

3 Predicate 应用案例实践

内置的路由断言工厂应用案例:

server:port: 9000
spring:application:name: sca-gatewaycloud:nacos:server-addr: localhost:8848gateway:discovery:locator:enabled: true #开启通过服务中心的serviceId 创建路由的功能routes:- id: bd-id##uri: http://localhost:8081/uri: lb://nacos-providerpredicates: ###匹配规则- Path=/nacos/provider/echo/**- Before=2021-01-30T00:00:00.000+08:00- Method=GETfilters:-  StripPrefix=1 # 转发之前去掉1层路径

说明:当条件不满足时,则无法进行路由转发,会出现404异常。

4 谓词的面试点

四 过滤器(Filter)增强分析(了解)

1 描述

过滤器(Filter)就是在请求传递过程中,对请求和响应做一个处理。Gateway 的Filter从作用范围可分为两种:GatewayFilter与GlobalFilter。其中:

GatewayFilter:应用到单个路由或者一个分组的路由上。
GlobalFilter:应用到所有的路由上。

2 局部过滤器设计及实现

在SpringCloud Gateway中内置了很多不同类型的网关路由过滤器。具体如下:
案例分析:

2.1 基于AddRequestHeaderGatewayFilterFactory,为原始请求添加Header。

例如,为原始请求添加名为 X-Request-Foo ,值为 Bar 的请求头:

spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgfilters:- AddRequestHeader=X-Request-Foo, Bar

2.2 基于AddRequestParameterGatewayFilterFactory,为原始请求添加请求参数及值

例如,为原始请求添加名为foo,值为bar的参数,即:foo=bar

spring:cloud:gateway:routes:- id: add_request_parameter_routeuri: https://example.orgfilters:- AddRequestParameter=foo, bar

2.3 基于PrefixPathGatewayFilterFactory,为原始的请求路径添加一个前缀路径

例如,该配置使访问${GATEWAY_URL}/hello 会转发到uri/mypath/hello

spring:cloud:gateway:routes:- id: prefixpath_routeuri: https://example.orgfilters:- PrefixPath=/mypath

2.4 基于RequestSizeGatewayFilterFactory,设置允许接收最大请求包的大小

spring:cloud:gateway:routes:- id: request_size_routeuri: http://localhost:8080/uploadpredicates:- Path=/uploadfilters:- name: RequestSizeargs:# 单位为字节maxSize: 5000000

如果请求包大小超过设置的值,则会返回 413 Payload Too Large以及一个errorMessage

3 全局过滤器设计及实现

全局过滤器(GlobalFilter)作用于所有路由, 无需配置。在系统初始化时加载,并作用在每个路由上。通过全局过滤器可以实现对权限的统一校验,安全性验证等功能。一般内置的全局过滤器已经可以完成大部分的功能,但是对于企业开发的一些业务功能处理,还是需要我们 自己编写过滤器来实现的,那么我们一起通过代码的形式自定义一个过滤器,去完成统一的权限校验。 例如,当客户端第一次请求服务时,服务端对用户进行信息认证(登录) 认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证 以后每次请求,客户端都携带认证的token 服务端对token进行解密,判断是否有效。

3.1 带参数的过滤器方式

package com.cy.filters;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String username=exchange.getRequest().getQueryParams().getFirst("username");if (!"admin".equals(username)) {System.out.println("认证失败");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}//调用chain.filter继续向下游执行return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

可以使用此功能模拟客户端(网页url):

启动Gateway服务,url携带username=admin时,如图所示:

假如在访问的url中不带“username=admin”这个参数,可能会出现异常:响应主体为空,认证失败

3.2 前缀白名单的过滤器方式

第一步:配置文件添加自定义白名单,后期可以添加到nacos配置中心进行动态修改

 第二步: 编辑自定义全局过滤器

package com.jt.config;import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.net.URI;
import java.util.HashMap;
import java.util.Map;//自定义的全局过滤器,作用域为所有路由
@Component
public class AuthGatewayFilter implements GlobalFilter, Ordered {/**业务可以写到这个filter方法内部* @param exchange  基于此对象可以获取请求和响应对象* @param chain     这个对象指向了一个过滤链(链中有多个过滤器)* *///获取前缀@Value("${white.prefix}")private String whitePrefix;@Overridepublic Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {//1.获取请求对象ServerHttpRequest request = exchange.getRequest();//2.获取请求数据String path = request.getURI().getPath();System.out.println("path="+path);//String username = request.getQueryParams().getFirst("username");//3.对请求数据进行处理System.out.println("whitePrefix="+whitePrefix);if (!path.startsWith(whitePrefix)) {//判断是否以白名单前缀开头ServerHttpResponse response = exchange.getResponse();//结束当前请求//方式一:直接结束//response.setStatusCode(HttpStatus.UNAUTHORIZED);//return response.setComplete();//return exchange.getResponse().setComplete();//方式二:假如希望响应一些具体内容到客户端//response.setStatusCode(HttpStatus.BAD_GATEWAY);//String content = "request failure";//byte[] bytes = content.getBytes();//方式三:响应的内容从map对象转换为json字符串,这就需要Gson的依赖Map<String,Object> map=new HashMap<>();map.put("message","request failure");map.put("status",502);//String jsonStr ="{\"message\":\"request failure\",\"status\":502}";Gson gson = new Gson();String jsonStr = gson.toJson(map);//json串转为对象,就使用.fromJson()byte[] bytes = jsonStr.getBytes();DataBuffer dataBuffer = response.bufferFactory().wrap(bytes);return response.writeWith(Mono.just(dataBuffer));//spring webFlux中Mono是一个可以封装0或1个元素的序列对象}//4返回响应结果return chain.filter(exchange);//将请求交给下一个过滤器处理}@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}
}

第三步:在Http client测试:

说明:如果把白名单前缀设置为nacos就可以通过认证

4 网关过滤器的面试题

五 限流设计及实现

1 限流概述

网关是所有请求的公共入口,所以可以在网关进行限流,而且限流的方式也很多,我们采用Sentinel组件来实现网关的限流。Sentinel支持对SpringCloud Gateway、Zuul等主流网关进行限流。参考网址如下:

https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

2 限流快速入门

2.1 添加依赖

在原有spring-cloud-starter-gateway依赖的基础上再添加如下两个依赖

<!--sentinel限流与熔断,通过MVC拦截器限流-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--网关限流-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<!--限流的监控--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

2.2 添加sentinel及路由规则(假如已有则无需设置)

routes:  #gateway下面的- id: route01uri: lb://sca-providerpredicates: ###匹配规则- Path=/nacos/provider/echo/**
sentinel: #sentinel限流属于cloud下面的,注意格式transport:dashboard: localhost:8180 #Sentinel 控制台地址port: 8719 #客户端监控API的端口eager: true  #取消Sentinel控制台懒加载,即项目启动即连接

2.3 启动网关项目,检测sentinel控制台的网关菜单

启动时,添加sentinel的jvm参数,通过此菜单可以让网关服务在sentinel控制台显示不一样的菜单

-Dcsp.sentinel.app.type=1

假如是在idea中,可以参考下面的图进行配置

Sentinel 控制台启动以后,界面如图所示:

说明,假如没有发现请求链路,API管理,关闭网关项目,关闭sentinel,然后重启sentinel,重启网关项目.

2.4 在sentinel面板中设置限流策略

2.5 通过url进行重复访问检测是否实现了限流操作

3 基于请求属性限流

定义指定routeId的基于属性的限流策略如图所示:

3.1 以请求头为例:

3.2  在http client模拟客户端请求,输入url并编辑请求头,反复访问查看限流效果:

但是反复刷新时:

而且, 通过postman进行测试分析也是同样效果:

4 自定义API维度限流(重点)

自定义API分组,是一种更细粒度的限流规则定义,它允许我们利用sentinel提供的API,将请求路径进行分组,然后在组上设置限流规则即可。

4.1 新建API分组

保持provider服务器和gateway服务器的启动再设置

4.2 新建分组流控规则

4.3 进行访问测试,如图所示

5 自定义流控网关返回值

自定义定义配置类,设计流控返回值 :

package com.jt.config;import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.HashMap;
import java.util.Map;
/*自定义网关限流返回值*/
@Configuration
public class GatewayConfig {public GatewayConfig(){ //构造方法GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange,Throwable throwable) {//1.构建响应数据Map<String,Object> map=new HashMap<>();map.put("state",429);map.put("message","two many request");//2.返回值方式一:基于alibaba 的fastjson将对象转换为json串//String jsonStr = JSON.toJSONString(map);//fastjson//2.返回值方式二:基于Google公司的gson将对象转换为jsonGson gson=new Gson();String jsonStr = gson.toJson(map);//3.创建Mono对象,将结果响应到客户端return ServerResponse.ok().body(Mono.just(jsonStr),String.class);}});}
}

其中,Mono 是一个发出(emit)0-1个元素的Publisher

重新启动网关服务器,页面url访问后,在sentinel中设置API分组访问权限以及流控设置,最后返回访问url,效果如下:

6 流控网关的面试题

六 总结(Summay)

1 重难点

  1. 网关(Gateway)诞生的背景?(第一:统一微服务访问的入口,第二:对系统服务进行保护,第三进行统一的认证,授权,限流)
  2. 网关的选型?(Netifix Zuul,Spring Cloud Gateway,…)
  3. Spring Cloud Gateway的入门实现(添加依赖,路由配置,启动类)
  4. Spring Cloud Gateway中的负载均衡?(网关服务注册,服务的发现,基于uri:lb://服务id方式访问具体服务实例)
  5. Spring Cloud Gateway中的断言配置?(掌握常用几个就可,用时可以通过搜索引擎去查)
  6. Spring Cloud Gateway中的过滤器配置?(掌握过滤器中的两大类型-局部和全局)
  7. Spring Cloud Gateway中的限流设计?(Sentinel)

2 FAQ

  1. Gateway在互联网架构中的位置?(nginx->gateway–>微服务–>微服务)
  2. Gateway底层负载均衡的实现?(Ribbon)
  3. Gateway应用过程中设计的主要概念?(路由id,路由uri,断言,过滤器)
  4. Gateway中你做过哪些断言配置?(after,header,path,cookie,…)
  5. Gateway中你用的过滤器有哪些?(添加前缀,去掉前缀,添加请求头,…,负载均衡,…)

3 该知识点会出现的bug

四阶段--day06-网关Gateway 应用实践相关推荐

  1. 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:雄 ...

  2. day02 Nacos集群配置、Feign远程调用和统一网关Gateway

    1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用. 统一配置管理 当微服务部署的实例越来越多,达到数十.数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错.我们需要一 ...

  3. 微服务_服务网关(Gateway)

    目录 一.为什么需要网关 二.SpringCloud网关的实现方式 三.Gateway实践 1)创建gateway服务,引入依赖 2)编写启动类 3)编写基础配置和路由规则 4)重启测试 5)网关路由 ...

  4. Spring cloud网关gateway代理websocket报Max frame length of 65536 has been exceeded

    Spring cloud网关gateway代理websocket报io.netty.handler.codec.http.websocketx.CorruptedWebSocketFrameExcep ...

  5. 新能源电动汽车(带网关Gateway)车身网络控制系统CAN数据开发趋势

    随着国内新能源汽车的崛起好快速发展,电动汽车无论是平民消费级,还是昂贵的大品牌,基本全部支持CAN网络,大部分的车型已经配备了网关(Gateway).包括了传统汽油车类的奔驰.宝马.大众.保时捷.通用 ...

  6. 微服务学习之网关(Gateway)的搭建及使用

    微服务系列 1.Nacus 服务搭建及使用 2.Nacos 配置中心 3.Nacos 服务注册与发现之OpenFeign服务间调用 4.Spring Security & Oauth2 认证授 ...

  7. 6.SpringCloud -- 注册中心与配置中心 Nacos、网关 Gateway

    6.SpringCloud -- 注册中心与配置中心 Nacos.网关 Gateway 一.了解一下 SpringCloud Alibaba 1.1 SpringCloudAlibaba (1)简单说 ...

  8. 基于go-micro微服务的实战-实现网关Gateway(三)

    基于go-micro微服务的实战-实现网关Gateway(三) 文章最后附带完整代码 基于go-micro实现网关层 创建好网关层目录 common: 公告模块,配置初始化等 conf: 配置文件 h ...

  9. 四步骤厘清数据资产管理实践

    本章定义了一种数据资产管理实践的通用步骤:"统筹规划→管理实施→稽核检查→资产运营".需要说明的是,各步骤之间并无严格的先后顺序,组织可结合自身情况在各阶段制定合理的实施方案. 图 ...

最新文章

  1. 从python存入的文件是乱码_如何解决python写入html文件中乱码的现象(图文详解)...
  2. flink中的table api中的CloseableIterator是什么意思?
  3. linux系统盘比较小,35M的中文linux硬盘简单安装方法Live-CD:SliTaz.tw-全世界最小的li...
  4. ASP.NET Core分布式项目实战(oauth2 + oidc 实现 client部分)--学习笔记
  5. Ajax前后端对接---Springmvc
  6. Windows常用命令集
  7. SQL Server2016 新功能之SQL安装篇
  8. android蓝牙设置特征属性,Android BLE蓝牙详细解读(二)
  9. 05:整数序列的元素最大跨度值
  10. 计算机毕业论文答辩评语,论文答辩评语
  11. matlab 二进制写入文件,在Matlab中读取/写入二进制文件
  12. 功率计量芯片HLW8012介绍与应用
  13. 如何获得一个RAC Oracle数据库(从Github - oracle/docker-images) - 本地版
  14. 国际学术会议-英文演讲稿
  15. 太阳直射点纬度计算公式_高中地理——每日讲1题(晨昏线、正午太阳高度角、太阳的方位)...
  16. 【Xmanager】Xbrowser-XDMCP远程访问RHEL5.3配置
  17. Airflow Architecture
  18. Jmeter+Prometheus+Grafana性能监控平台:将JMeter压测数据输出到Prometheus
  19. python实现简单的声音文件读写
  20. php 正则筛选靓号如AABBCC(连对),abcdef(顺子)等QQ靓号保留

热门文章

  1. java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())
  2. ASEMI代理ADXL345BCCZ-RL7原装ADI车规级ADXL345BCCZ-RL7
  3. 1.get_dms_camera_coord_by_cheeseboard
  4. 雅迪在瑞士和拉丁美洲开设旗舰店;起亚发布全新Logo和品牌口号;戴姆勒与印孚瑟斯达成战略合作 | 美通企业周刊...
  5. ubuntu java卸载_ubuntu如何完全卸载Java
  6. Windows锁屏实现
  7. 特征选择—相关性过滤
  8. 【NOJ1326】【算法实验三】推箱子
  9. Mal-PEG12-acid,357277-61-3溶解性:水、DMSO、DCM、DMF
  10. 破解锐捷3.35-0618的密码