精选列表

搜索[SpringCloud],共1270篇文章
优秀的个人博客,低调大师

Jboot v3.10.7 发布,基于 JFinal 类似 SpringCloud 的框架

Jboot 一个更简单的分布式、微服务框架。 Jboot是一个基于 JFinal、JFinal-Undertow、Dubbo、Seata、Sentinel、ShardingSphere、Nacos 等开发的微服务框架,帮助开发者降低微服务、分布式开发门槛。爽爽开发,快乐生活。 到目前为止,Jboot 已经开源超过了 5 年的时间,迭代了 200+ 个版本,已经被超过 1000+ 公司在使用,其中包含了多个知名的上市公司,我们了解到的多个使用 Jboot 开发的产品,用户量超过 1亿 以上。 Jboot v3.10.7 更新内容如下: 新增:JbootHttpRequest 添加 sslContext 的配置,方便自定义 ssl 新增:JbootConfigManager 添加 setBootProperties 方法,方便用于添加启动配置 新增:工具类 ReflectUtil 新增 searchFieldList() 方法 新增:添加 TypeConverterFunc,用于处理前端传入枚举内容 优化:JbootShiroInvokeListener,在 onInvokeBefore() 方法添加返回值 AuthorizeResult,更加方便整合 Jwt sso 等 优化:升级 jedis/jsoup/jfinal/fastjson 等到最新版本 修复:ClassScanner 添加排除的前缀时,如果有大写字母不生效的问题 修复:当使用 @Api(collect={}) 时,子 Controller 路径错误的问题 Jboot 开发文档: http://www.jboot.io 同时,Jboot 官方也推出了收费的、企业级快速开发框架 JbootAdmin (如下图所示),真诚的为各位开发者提供一站式、保姆式服务。请咨询海哥。 更多关于 JbootAdmin 请参考:http://jboot.io/jbootadmin/feature.html Maven 依赖: <dependency> <groupId>io.jboot</groupId> <artifactId>jboot</artifactId> <version>3.10.7</version> </dependency> Hello World: @RequestMapping("/") public class HelloWorld extends JbootController { public void index(){ renderText("hello world"); } public static void main(String[] args){ JbootApplication.run(args); } }

优秀的个人博客,低调大师

SpringCloud技术专题】「Feign」从源码层面让你认识Feign工作流程和运作机制

Feign工作流程源码解析 什么是feign:一款基于注解和动态代理的声明式restful http客户端。 原理 Feign发送请求实现原理 微服务启动类上标记@EnableFeignClients注解,然后Feign接口上标记@FeignClient注解。@FeignClient注解有几个参数需要配置,这里不再赘述,都很简单。 Feign框架会扫描注解,然后通过Feign类来处理注解,并最终生成一个Feign对象。 解析@FeignClient注解,生成MethodHandler 具体的解析类是ParseHandlerByName。这个类是ReflectiveFeign的内部类。 // 解析注解元数据,使用Contract解析 List<MethodMetadata> metadata = this.contract.parseAndValidateMetadata(key.type()); 拿到注解元数据以后,循环处理注解元数据,创建每个方法对应的MethodHandler,这个MethodHandler最终会被代理对象调用。最终MethodHandler都会保存到下面这个集合中,然后返回。 Map<String, MethodHandler> result = new LinkedHashMap(); 解析完成以后,调用ReflectiveFeign.newInstance()生成代理类。 MethodHandler是feign的一个接口,这个接口的invoke方法,是动态代理调用者InvocationHandler的invoke()方法最终调用的方法。 重新表述一遍:InvocationHandler的invoke()方法最终回调MethodHandler的invoke()来发送http请求。这就是Feign动态代理的具体实现。 ReflectiveFeign类的newInstance()方法的第57行: // 创建动态代理调用者 InvocationHandler handler = this.factory.create(target, methodToHandler); // 反射生成feign接口代理 T proxy = Proxy.newProxyInstance(加载器, 接口数组, handler); InvocationHandler.invoke()的具体实现在FeignInvocationHandler.invoke(),FeignInvocationHandler也是ReflectiveFeign的一个内部类。里面有很多细节处理这里不再赘述,我们直接进入核心那一行代码,以免影响思路,我们是理Feign的实现原理的!不要在意这些细节! // InvocationHandler的invoke()方法最终回调MethodHandler的invoke()来发送http请求 ReflectiveFeign类的invoke()方法,第323行,代码的后半段,如下: (MethodHandler)this.dispatch.get(method). invoke(args); this.dispatch:这是一个map,就是保存所有的MethodHandler的集合。参考创建InvocationHandler的位置:ReflectiveFeign类的newInstance()方法的第57行。 this.dispatch.get(method):这里的method就是我们开发者写的feign接口中定义的方法的方法名!这段代码的意思就是从MethodHandler集合中拿到我们需要调用的那个方法。 this.dispatch.get(method). invoke(args):这里的invoke就是调用的MethodHandler.invoke()!动态代理回调代理类,就这样完成了,oh my god,多么伟大的创举! MethodHandler.invoke()的具体实现:SynchronousMethodHandler.invoke() 到了这里,就是发送请求的逻辑了。发送请求前,首先要创建请求模板,然后调用请求拦截器RequestInterceptor进行请求处理。 // 创建RequestTemplate RequestTemplate template = this.buildTemlpateFromArgs.create(argv); // 创建feign重试器,进行失败重试 Retryer retryer = this.retryer.clone(); while(true){ try{ // 发送请求 return this.executeAndDecode(template); } catch(RetryableException var5) { // 失败重试,最多重试5次 retryer.continueOrPropagate(); } } RequestTemplate处理 RequestTemplate模板需要经过一系列拦截器的处理,主要有以下拦截器: BasicAuthRequestInterceptor:授权拦截器,主要是设置请求头的Authorization信息,这里是base64转码后的用户名和密码。 FeignAcceptGzipEncodingInterceptor:编码类型拦截器,主要是设置请求头的Accept-Encoding信息,默认值{gzip, deflate}。 FeignContextGzipEncodingInterceptor:压缩格式拦截器,该拦截器会判断请求头中Context-Length属性的值,是否大于请求内容的最大长度,如果超过最大长度2048,则设置请求头的Context-Encoding信息,默认值{gzip, deflate}。注意,这里的2048是可以设置的,可以在配置文件中进行配置: feign.compression.request.enabled=true feign.compression.request.min-request-size=2048 min-request-size是通过FeignClientEncodingProperties来解析的,默认值是2048。 我们还可以自定义请求拦截器,我们自定义的拦截器,也会在此时进行调用,所有实现了RequestTemplate接口的类,都会在这里被调用。比如我们可以自定义拦截器把全局事务id放在请求头里。 使用feign.Request把RequestTemplate包装成feign.Request feign.Request由5部分组成: method url headers body charset http请求客户端 Feign发送http请求支持下面几种http客户端: JDK自带的HttpUrlConnection Apache HttpClient OkHttpClient // 具体实现有2个类Client.Default 和LoadBalancerFeignClient response = this.client.execute(request, this.options); Client接口定义了execute()的接口,并且通过接口内部类实现了Client.execute()。 HttpURLConnection connection = this.convertAndSend(request, options); return this.convertResponse(connection).toBuilder(). request(request).build(); 这里的Options定义了2个参数: connectTimeoutMillis:连接超时时间,默认10秒。 readTimeoutMillis:读取数据超时时间,默认60秒。 这种方式是最简单的实现,但是不支持负载均衡,Spring Cloud整合了Feign和Ribbon,所以自然会把Feign和Ribbon结合起来使用。也就是说,Feign发送请求前,会先把请求再经过一层包装,包装成RibbonRequest。 也就是发送请求的另一种实现LoadBalancerFeignClient。 // 把Request包装成RibbonRequest RibbonRequest ribbonRequest = new (this.delegate, request, uriWithoutHost); // 配置超时时间 IClientConfig requestConfig = this.getClientConfig(options, clientName); // 以负载均衡的方式发送请求 return ((RibbonResponse)this.IbClient(clientName).executeWithLoadBalancer(ribbonRequest, requestConfig)).toResponse(); 以负载均衡的方式发送请求 this.IbClient(clientName).executeWithLoadBalancer(ribbonRequest, requestConfig))的具体实现在AbstractLoadBalancerAwareClient类中。 executeWithLoaderBalancer()方法的实现也参考了响应式编程,通过LoadBalancerCommand提交请求,然后使用Observable接收响应信息。 AbstractLoadBalancerAwareClient类的executeWithLoadBalancer()方法的第54行: Observable.just(AbstractLoadBalancerAwareClient.this.execute(requestForServer, requestConfig)); AbstractLoadBalancerAwareClient实现了IClient接口,该接口定义了execute()方法, AbstractLoadBalancerAwareClient.this.execute()的具体实现有很多种: OkHttpLoadBalancingClient RetryableOkHttpLoadBalancingClient RibbonLoadBalancingHttpClient RetryableRibbonLoadBalancingHttpClient 我们以RibbonLoadBalancingHttpClient为例来说明,RibbonLoadBalancingHttpClient.execute() 第62行代码: // 组装HttpUriRequest HttpUriRequest httpUriRequest = request.toRequest(requestConfig); // 发送http请求 HttpResponse httpResponse = ((HttpClient)this.delegate).execute(httpUriRequest); // 使用RibbonApacheHttpResponse包装http响应信息 return new RibbonApacheHttpResponse(httpResponse, httpUriRequest.getURI()); RibbonApacheHttpResponse由2部分组成: httpResponse uri 处理http相应 http请求经过上面一系列的转发以后,最终还会回到SynchronousMethodHandler,然后SynchronousMethodHandler会进行一系列的处理,然后响应到浏览器。 注册Feign客户端bean到IOC容器 查看Feign框架源代码,我们可以发现,FeignClientsRegistar的registerFeignClients()方法完成了feign相关bean的注册。 Feign架构图 第一步:基于JDK动态代理生成代理类。 第二步:根据接口类的注解声明规则,解析出底层MethodHandler 第三步:基于RequestBean动态生成request。 第四步:Encoder将bean包装成请求。 第五步:拦截器负责对请求和返回进行装饰处理。 第六步:日志记录。 第七步:基于重试器发送http请求,支持不同的http框架,默认使用的是HttpUrlConnection。

优秀的个人博客,低调大师

VIPKID面试官:说说SpringCloud微服务架构在互联网的优势!

高并发微服务架构设计 作为一个 IT 从业人员,我们经常会碰到类似于下面的一些问题: 单个项目巨大而沉重,难以维护。 系统稳定性得不到更有效的保证。 怎样才能持续地提升系统的性能。 怎样才能快速地响应需求的变更,并且系统更新不会引起任何抖动。 怎样才能更好地适应系统规模化的扩张。 针对上面这些问题,我们无时无刻不在努力地进行各种各样的尝试和探索,寻求更好的解决方案,或者使用更先进的技术。 目前来看,在互联网环境之中产生的微服务架构设计是一个比较理想的解决方案。 Java学习笔记共享地址:spring cloud学习笔记 微服务总体架构设计 一个使用了微服务的电商平台的总体架构设计如图 2-1 所示。 这是一个典型的微服务总体架构设计图,自上往下看,可以分为前台应用层、 API 接入层、业务应用层、服务中心和基础资源层结构,每层结构都有其自身的功能和特别的设计。 前台应用层可支持任何应用的客户端,如物联网、微信小程序、移动 App API 开放平台等。 API 接入层可以使用 Spring Cloud Zuul Gateway 设计网关,起到一个承上启下的作用,并且具备鉴权、路由和流控等功能。 业务应用层是微服务 基本应用 ,它本身也是一个微服务。这里主要是电商平台的一些后台管理功能 服务中 就是使用微服务设计的各种 AP 接口服务,这些服务一般使用基于 ST削风格的设计,对外提供轻量 API 接口服务。另外,在基础服务中间件中,提供服务治理、消息队列、监控告警、配置管理等服务。 基础资源是我们组建的私有云或者租用的公有云,为微服务搭建容器平台,提供数据存储、 DevOps 镜像仓库等服务。 在这个架构设计图中,除了上面这些,在水平方向上,还可以看到负载均衡、日志记录、链路跟踪,以及基于大型电商平台的运营平台等服务。 下面介绍微服务架构设计的优势,以及它所表现出来的高并发、高性能的特点。 自然的压力分解。 可弹性伸缩的集群环境。 高度的独立性设计。 API 的分层调用关系。 高可用的基础资源支持。 快速响应的自动化基础设施。 完善的监控体系。 微服务的安全保障。 自然的压力分解 对于一个大型系统来说,在使用微服务架构设计之后,原来针对单独一个应用所承受的压力,就自然而然地分散到众多微服务中。各个微服务可以使用不同的数据库,并且可以分开部署在不同的服务器上,所有这些,都是一种压力分流的方法。 可弹性伸缩的集群环境 微服务的部署和发布,最终都将纳入微服务的治理环境之中。这种治理环境是一个分布式的集群管理体系,对于每一个微服务来说,都能对其实行动态路由、负载均衡、服务降级等一系列的管控措施。同时,允许每个微服务根据其所承受的压力情况,进行自由的扩展和收缩,即具备可弹性伸缩的特性。 图2-2 是微服务的一个运行环境示意图,不管是作为提供接口服务的阻STAPI 微服务,还是提供操作界面的 WebUI 微服务,都可以根据需要在云端服务器上很方便地增加其运行副本,从而扩展它的负载能力。而且,这种扩展并不局限于在一个虚拟环境中,它可以跨机房、跨地区,甚至跨国界。当然,微服务所使用的基础资源,同样具备自由扩展的能力。这样才能保证在整个系统平台中可以应对任何高并发的调用,而不存在性能瓶颈。 高度的独立性设计 微服务架构的去中心化的设计特点,为每个微服务的设计提供了高度的独立性。这样,我们就可以根据每个微服务的特点,选择数据库或者通信方式,以发挥其独特的效能。 比如,对于数据量不是很大,关联性不是很复杂的数据,可以使用传统的关系数据库,如MySQL 或者 Oracle 。对于数据量较大,更新不是很频繁的数据,可以使用 MongoDB NoSQL数据库。对于一些关系复杂,关联比较多的数据,则可以使用图数据库,如 Neo4j 等。这样针对不同的业务特性,使用合适的数据库,就可以充分发挥应用程序的性能。 对于通信方式来说,有些程序对实时数据很敏感,只能使用接口的方式进行实时调用:而有的程序对实时数据并没有太多要求,但是通信量很大,这时就可以使用异步消息进行调用。 这样,通过有针对性的独立设计,可以最大限度地发挥应用程序的效能。 API 的分层调用关系 微服务使用 GateWay 网关接口方式对外部环境提供服务。这种方式使用分层结构设计,在Gate Way 层既可以直接调用 RESTAPI 微服务接口服务,也可以再经过一层设计,即使用 Backendfor Frontend 层对复杂的调用进行一次包装设计。例如,当需要对多个微服务进行调用时,可以将多个调用组装成一个单一接口服务,从而避免微服务内部环境与外部环境的多重通信。另外,有的通信可以使用 MQ (Message Queue )方式以异步方式进行。 图2-3 是一个 GateWay 多层次调用关系示意图,在这个图中,每个层次都可以进行负载均衡设计,从而能够非常有效地提高这种调用关系的并发性。其中,微服务内部环境的负载均衡设计可以由服务治理进行处理,而处在外部环境中的 GateWay 的负载均衡设计则可以使用 Nginx等工具进行实施。 高可用的基础资源支持 在微服务架构设计中,通常是使用云服务来组建基础资源的。其中,云服务既可以租用云服务提供商的服务器,也可以自己组建私有云,或者两者兼而有之。 基于云端组建的基础资源,包括数据库、缓存和文件系统等,这些资源既可以使用云服务提供商提供的优质 RDBS 、分布式数据库和对象存储等服务,也可以自己搭建各种集群体系。 这样,就可以保证每一种基础资源的使用都不会成为另外一个系统的瓶颈,这是对高并发微服务架构设计的有力补充和支持。 快速晌应的自动化基础设施 自动化基础设施建设是微服务架构设计中的一项基本要求,涉及代码管理、代码检查、集成测试、自动化测试、持续交付、自动化部署等一系列问题。 不管是持续集成、持续交付,还是敏捷开发等,这些都是 DevOps 的一种管理机制。这种管理机制可以提高微服务架构设计中各个微服务应用的应变能力,可以快速响应整个系统的变更和更新,从而充分提升整个微服务架构的总体效能。 完善的监控体系 通过使用 Sp Cloud 工具套件并结合第三方工具,我们可以为微服务的运行环境构建一个完善的监控体系,从而有效保证微服务的稳定性和健壮性。 这一监控体系包括健康检查、告警系统、链路跟踪、日志记录和查询等内容。通过健康检查和告警系统,可以及时发现系统中可能存在的问题和隐患,从而减少事故的发生。链路跟踪和日志记录可以提供非常详细的服务调用轨迹,非常适合用来检验和查找复杂的系统内部问题,或者某些可能存在的隐藏错误。 微服务的安全保障 越大型的系统,系统的并发性越高,危险性越大,其安全保障也越重要。系统的安全设计包括防火墙设计、防攻击设计、访问控制设计、数据保密设计、数据备份及灾备等各个方面的内容。而安全防护是系统安全的第一道屏障,我们将使用防火墙及动态感知等设备,为微服务的服务器组建,提供一个安全可靠的分布式环境。 Spring Cloud面试真题共享地址:spring cloud答案解析。 如图 2-4 所示,是根据阿里云设计的一个安全管理架构,通过安全防护和安全预警 对不安全的访问或可能存在的攻击进行有效隔离,从而保证系统的安全和稳定。 如果需要进行跨机房或跨地区的微服务互联,则必须在保证安全的前提下,通过 VPC 专网使用专用通道进行通信。 小结 微服务架构设计风格本身就是一种高并发的机制。依靠云服务环境,我们可以把微服务使用的基础资源,通过自动化基础设施建设,提供成一种可伸缩、高并发、高可用的环境。同时,通过使用 Spring Cloud 工具套件和第三方库,充分保证微服务的高度可扩展性。不管是哪一种架构设计,系统的稳定性、健壮性和可靠性都缺一不可。

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。