注册中心:Nacos
配置中心:Nacos
网关:Gateway
流量控制组件:Sentinel(网关统一限流,控制台sentinel-dashboard)、Hystrix(结合FeignClient方便使用)
HTTP客户端:OpenFeign
Nacos注册中心安装
单机模式、集群模式、多集群模式
其他注册中心框架:Eureka、Zookeeper等
安装JDK8配置JAVA_HOME
下载Nacos
https://github.com/alibaba/nacos/releases
启动nacos
windows cmd执行:startup.cmd -m standalone
或者 .\startup.cmd -m standalone
linux 执行:startup.sh -m standalone
windows下删除startup.cmd下面语句不然会报错
1 | -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages |
访问
输入 localhost:8848/nacos 用户名和密码 都是 nacos
nacos配置存储在MYSQL数据库中
数据库执行conf/mysql.sql
,建立配置表
修改conf/application.properties
,找到位置,放开相关注释,修改数据库连接信息
1 | *************** Config Module Related Configurations ***************# |
可能由于网络等原因出现数据库连接不上要把超时时间改大connectTimeout=10000&socketTimeout=30000
单位ms。connectTimeout 建立连接的时候参数在建立连接后不会再生效,socketTimeout 参数有设置的意义,在查询时间超过一定的阈值后,断开连接可以防止客户端的连接被一直占用。
当SocketServer返回数据的时候(类似于SQL结果集的返回)其流程是:服务端程序数据(数据库) -> 内核Socket Buffer -> 网络 -> 客户端Socket Buffer -> 客户端程序JDBC所在的JVM内存; 在数据库被突然停掉或是发生网络错误时由于TCP/IP的结构原因,socket没有办法探测到网络错误,因此应用也无法主动发现数据库连接断开。如果没有设置socket timeout的话,应用在数据库返回结果前会无期限地等下去,这种连接被称为dead connection。
可能对于带有排序、聚集函数的大查询,socketTimeout 应该设置很大的值
socket timeout必须高于statement timeout
从nacos中获取配置
pom增加依赖
1 | <dependency> |
项目中增加bootstrap.yml配置 ,name与active组合成dataid
1 | # Tomcat |
nacos控制台中添加auth-dev.yml配置信息
Gateway
配置
system/**
开头的路径会转发给provider服务。
1 | 8888 = |
1 | cloud: |
代码主要内容
- 权限过滤:定义filter校验token与通过策略放行部分路径进行权限过滤控制
- 服务降级:Sentinel返回错误信息
- 跨域控制
Ribbon配置
增加Ribbon依赖
1 | <dependency> |
可以与Ribbon组合使用,实现负载均衡策略的配置。yml中通过NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RoundRobinRule
配置项目指定。
还可以自定义负载均衡策略。
Open Feign Client
Spring Cloud框架提供了RestTemplate和FeignClient两个方式完成服务间调用
作为Spring Cloud的子项目之一,Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式,为微服务架构下服务之间的调用提供了解决方案。首先,利用了OpenFeign的声明式方式定义Web服务客户端;其次还更进一步,通过集成Ribbon或Eureka实现负载均衡的HTTP客户端。
Feign 是一个 Java 到 HTTP 的客户端绑定器,灵感来自于 Retrofit 和 JAXRS-2.0 以及 WebSocket。Feign 的第一个目标是降低将 Denominator 无变化的绑定到 HTTP APIs 的复杂性,而不考虑 ReSTfulness。
Feign 使用 Jersey 和 CXF 等工具为 ReST 或 SOAP 服务编写 java 客户端。此外,Feign 允许您在 Apache HC 等http 库之上编写自己的代码。Feign 以最小的开销将代码连接到 http APIs,并通过可定制的解码器和错误处理(可以写入任何基于文本的 http APIs)将代码连接到 http APIs。
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。
因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,Feign,它也是基于Ribbon实现的工具。
简单测试定义springclouddemo-provider
springclouddemo-consumer
springclouddemo-gateway
三个微服务根据需要增加项目前缀容易识别,一般是项目名称,比如springclouddemo-
,正常业务是一个服务可以同时是服务消费者与服务提供者,服务命名需要根据具体需求定义。
maven依赖
1 | <dependency> |
demo
消费者微服务定义调用其他微服务服务的接口
1 | package vip.infotech.springclouddemoconsumer.feignclient; |
消费者微服务业务实现调用TestService的test
1 | package vip.infotech.springclouddemoconsumer.service.impl; |
服务提供者微服务Controler层定义updateUserAge
与test
提供其他服务调用。
feign配置
1 | # 设置 feign 客户端超时时间, 默认 1s |
日志
1 |
|
1 | logging: |
Ribbon负载均衡算法:(可以在配置文件中配置使用的算法)
com.netflix.loadbalancer.RandomRule:随机算法实现;
RoundRobinRule:轮询负载均衡策略,依次轮询所有可用服务器列表,遇到第一个可用的即返回;
RetryRule :先按照RoundRobinRule策略获取服务,如果获取服务失败会在指定时间内重试;
AvaliabilityFilteringRule: 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) ;
BestAvailableRule :会先过滤掉由于多次访问故障二处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
WeightedResponseTimeRule: 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低;
ZoneAvoidanceRule: 复合判断server所在区域的性能和server的可用性选择server
问题集
gateway问题1
Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' that could not be found.
将pom.xml中关于spring-boot-start-web模块的jar依赖去掉
出现对象无法注入成功优先检查是否出现模块POM重复引用
gateway不需要数据源
在启动类增加排除数据源自动配置注解 SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
feignclient远程调用服务404与401
将SpringBoot配置文件里面 server.servlet.context-path 注释掉即可。
注释掉后报错401没有权限说明已经调用到服务了。oauth2.0增加放行的路径
1 | security: |
1 | public class ResourceServerConfig extends ResourceServerConfigurerAdapter |
POSTMAN测试方法
需要Authorization 选择basicAuth设置用户名密码或者其他传递参数
源码分析
gateway
1 | public class RoutePredicateHandlerMapping extends AbstractHandlerMapping { |
websocket 连接建立才进行路由,后续直接走代理不重复进行路由。
扩展
dubbo
(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。核心部件:Remoting、RPC、Registry。跟ZK组合使用,dubbo就是动物园的动物,zookeeper是动物园。我们通过dubbo 建立service这个服务,并且到zookeeper上面注册,填写对应的zookeeper服务所在 的IP及端口号。管理中心(动物园)和供给者(各种动物),消费者(万千游客)。通过dubbo-admin可以对消费者和提供者进行管理,是一个war包,可以在tomcat中启动。
Dubbo 提供了4种负载均衡实现,分别是基于权重随机算法的 RandomLoadBalance、基于最少活跃调用数算法的 LeastActiveLoadBalance、基于 hash 一致性的 ConsistentHashLoadBalance,以及基于加权轮询算法的 RoundRobinLoadBalance。
Dubbo使用dubbo缺省协议,基于netty+hessian(二进制序列化),采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况,不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。还可以支持RMI、Hessian、Http、Webservice、Thrift、memcached、redis、RestFull协议。可以不同服务配置不同服务。使用的是netty,主流通信框架包括netty,mina,Grizzly都可以选用。
源码分析
nacos
asyncContext 实现long polling。 req.startAsync();asyncContext.setTimeout(0L);
LongPollingService.java onEvent() 配置修改的时候触发返回 默认等待30-0.5=29.5秒