SpringCloud整合Dubbo3实战高并发微服务架构设计无密F享

您所在的位置:网站首页 手写rpc框架 SpringCloud整合Dubbo3实战高并发微服务架构设计无密F享

SpringCloud整合Dubbo3实战高并发微服务架构设计无密F享

2023-03-13 23:34| 来源: 网络整理| 查看: 265

SpringCloud整合Dubbo3实战高并发微服务架构设计

下栽の地止:http://ukoou.com/resource/1306

基于Springboot的效劳器开发脚手架——自动生成工具

该工具默许生成java效劳项目,但能够配置生成其他类型的项目或目录构造,如python、recat等。这个工具自带了前面课程提到的一切功用,比方dao操作、http、tracklog日志、异常段处置等。能够俭省大量建立项目和根底工作的开发时间。而且生成的项目文件源文件能够修正两次。

首先,如何运用它

倡议下载ReleasesV1.0,解压后先运转包中包含的test.sh脚本,会在解压后的目录的/output下生成三个预置的三个项目,restful、grpc和fixed(restful+grpc)。

其次,生成一个定制项目。

Dubbo3 作为极具潜力的云原生 RPC 框架,是面向高并发场景进行微服务开发时的好帮手。本课程用秒杀购物商城项目贯穿,基于 Dubbo3 与其他流行的组件组合实践,完成微服务架构方案设计及落地,帮助大家训练微服务设计思路并掌握 Dubbo3 相关开发技能。

首先讨论了架构设计,

什么是微服务架构?什么是Spring Cloud小型化、自治化、扁平化、轻量级、渐进式。

微服务架构和SOA的比较1.微服务轻量级,SOA重量级。2.微服务是自治性,SOA是集中式管理。3.微服务适合高流量、高并发,SOA有局限性。

接下来就是代码级别的教程了,先是开发环境的准备和安装。然后用Consul创建注册中心和统一配置管理。使用Hystrix作为熔断器,Admin做监控、Zipkin做链路跟踪、ELK做日志分析。

领域驱动设计、Thymeleaf、Mybatis、FastDFS、MogoDB、SSO。Docker、Kubernets、MySQL集群、OneProxy、分库分区、LVS、Jenkins。

SpringCloud-Gateway实现API网关服务搭建和实现

Spring Cloud Gateway(SCG)提供了一个用于在Spring和Java之上构建API网关的库。

它的目的是提供一种简单而有效的方式来路由到API,并为它们提供交叉关注,如:安全、监控/指标和弹性。SCG是一个非阻塞式的API。当使用非阻塞式API时,一个线程总是可以用来处理传入的请求。这些请求在后台被异步处理,一旦完成就会返回响应。因此,在使用SCG时,没有传入的请求会被阻断。春天云网关架构它由以下构件组成:- 1.**1.路由。**路由是网关的基本构建模块。它由以下部分组成。

ID目的地URL谓词的集合和过滤器的集合

2.谓词(Predicate)。 这类似于Java 8中的Predicate函数。使用这个功能,我们可以匹配HTTP请求,如头文件,url,cookies或参数。3.过滤器。 这些是Spring框架网关过滤器的实例。使用它,我们可以根据需求修改请求或响应。

当客户端向SCG发出请求时,Gateway Handler Mapping首先检查请求是否与路由匹配。这种匹配是使用谓词完成的。如果它与谓词匹配,那么请求就会被发送到过滤器。实现Spring云网关使用SCG,我们可以通过以下两种方式创建路由。

使用基于java的配置,以编程方式创建路由。使用基于属性的配置(即application.properties或application.yml)来创建路由。

在这里,我们将使用基于属性的配置来实现SCG。我们将实现SCG应用程序,根据url模式将请求路由到其他两个微服务。

实现第一个微服务。首先,在pom.xml中添加以下依赖项。 org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-gateway 复制代码定义application.yml如下。spring: application: name: first-serviceserver: port: 8081复制代码创建一个控制器类,暴露GET REST服务。import org.springframework.web.bind.annotation.*;@RestController@RequestMapping("/employee")public class FirstController { @GetMapping("/message") public String test() { return "Hello in First Service"; }}复制代码用@SpringBootApplication注解创建bootstrap类。import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class FirstApplication { public static void main(String[] args) { SpringApplication.run(FirstApplication.class, args); }}复制代码在这里,我们将做同样的事情,另一个微服务。实现第二个微服务。首先,在pom.xml中添加以下依赖项。 org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-gateway 复制代码定义application.yml如下。spring: application: name: second-serviceserver: port: 8082复制代码创建一个控制器类,暴露GET REST服务。import org.springframework.web.bind.annotation.*;@RestController@RequestMapping("/consumer")public class SecondController { @GetMapping("/message") public String test() { return "Hello in Second Service"; }}复制代码用@SpringBootApplication注解创建bootstrap类。import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class SecondApplication { public static void main(String[] args) { SpringApplication.run(SecondApplication.class, args); }}复制代码使用基于属性的配置实现Spring Cloud Gateway。首先,在pom.xml中添加以下依赖项。 org.springframework.cloud spring-cloud-starter-gateway复制代码定义application.yml如下。server: port: 8080spring: cloud: gateway: routes: - id: employeeModule uri: http://localhost:8081/ predicates: - Path=/employee/** - id: consumerModule uri: http://localhost:8082/ predicates: - Path=/consumer/**复制代码用@SpringBootApplication注解创建bootstrap类。import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class APIGatewayApplication { public static void main(String[] args) { SpringApplication.run(APIGatewayApplication.class, args); }}复制代码现在,做完这些后,启动我们刚刚开发的三个微服务。转到url - localhost:8080/employee/message。

转到url - localhost:8080/consumer/message

SpringCloud整合Dubbo3Dubbo很多人都不陌生,这毕竟是一款从2012年就开始开源的Java RPC框架,中间由于各种各样的原因停止更新4年半的时间,中间只发过一个小版本修了一个小bug,甚至大家都以为这个项目已经死掉了,竟然又在2017年9月份恢复了更新。网络上很多人都拿Dubbo和Spring Cloud做对比,可能在大家的心目中,这两个框架是可以画上等号的吧。后来在网络上有一个非常流行的表格,比较详细的对比了 Spring Cloud 和 Dubbo,表格如下: Dubbo SpringCloud服务注册中心 Zookeeper Spring Cloud Netfix Eureka服务调用方式 RPC REST API服务监控 Dubbo-monitor Spring Boot Admin熔断器 不完善 Spring Cloud Netflix Hystrix服务网关 无 Spring Cloud Netflix Zuul分布式配置 无 Spring Cloud Config服务跟踪 无 Spring Cloud Sleuth数据流 无 Spring Cloud Stream批量任务 无 Spring Cloud Task信息总线 无 Spring Cloud Bus以上列举了一些核心部件,当然这里需要申明一点,Dubbo对于上表中总结为“无”的组件不代表不能实现,而只是Dubbo框架自身不提供,需要另外整合以实现对应的功能,这样看起来确实Dubbo更像是Spring Cloud的一个子集。Dubbo在国内拥有着巨大的用户群,大家希望在使用Dubbo的同时享受Spring Cloud的生态,出现各种各样的整合方案,但是因为服务中心的不同,各种整合方案并不是那么自然,直到Spring Cloud Alibaba这个项目出现,由官方提供了Nacos服务注册中心后,才将这个问题完美的解决。并且提供了Dubbo和Spring Cloud整合的方案,命名为:Dubbo Spring Cloud。

Dubbo Spring Cloud概述Dubbo Spring Cloud构建在原生的Spring Cloud之上,其服务治理方面的能力可认为是Spring Cloud Plus,不仅完全覆盖Spring Cloud 原生特性,而且提供更为稳定和成熟的实现,特性比对如下表所示:功能组件 Spring Cloud Dubbo Spring Cloud分布式配置(Distributed configuration) Git、Zookeeper、Consul、JDBC Spring Cloud 分布式配置 + Dubbo 配置中心服务注册与发现(Service registration and discovery) Eureka、Zookeeper、Consul Spring Cloud 原生注册中心 + Dubbo 原生注册中心负载均衡(Load balancing) Ribbon(随机、轮询等算法) Dubbo 内建实现(随机、轮询等算法 + 权重等特性)服务熔断(Circuit Breakers) Spring Cloud Hystrix Spring Cloud Hystrix + Alibaba Sentinel 等服务调用(Service-to-service calls) Open Feign、RestTemplate Spring Cloud 服务调用 + Dubbo @Reference链路跟踪(Tracing) Spring Cloud Sleuth + Zipkin Zipkin、opentracing 等以上对比表格摘自Dubbo Spring Cloud官方文档。而且Dubbo Spring Cloud基于Dubbo Spring Boot 2.7.1 和 Spring Cloud 2.x开发,无论开发人员是Dubbo用户还是Spring Cloud用户, 都能轻松地驾驭,并以接近“零”成本的代价使应用向上迁移。Dubbo Spring Cloud致力于简化云原生开发成本,以达成提高研发效能以及提升应用性能等目的。

Dubbo Spring Cloud 主要特性(1)面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,屏蔽了远程调用底层细节。(2)智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。(3)服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。(4)高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。(5)运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。(6)可视化的服务治理与运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

Spring Cloud为什么需要RPC?在Spring Cloud构建的微服务系统中,大多数的开发者使用都是官方提供的Feign组件来进行内部服务通信,这种声明式的HTTP客户端使用起来非常的简洁、方便、优雅,但是有一点,在使用Feign消费服务的时候,相比较Dubbo这种RPC框架而言,性能堪忧。虽说在微服务架构中,会将按照业务划分的微服务独立部署,并且运行在各自的进程中。微服务之间的通信更加倾向于使用HTTP这种简单的通信机制,大多数情况都会使用REST API。这种通信方式非常的简洁高效,并且和开发平台、语言无关,但是通常情况下,HTTP并不会开启KeepAlive功能,即当前连接为短连接,短连接的缺点是每次请求都需要建立TCP连接,这使得其效率变的相当低下。对外部提供REST API服务是一件非常好的事情,但是如果内部调用也是使用HTTP调用方式,就会显得显得性能低下,Spring Cloud默认使用的Feign组件进行内部服务调用就是使用的HTTP协议进行调用。这时,我们如果内部服务使用RPC调用,对外使用REST API,将会是一个非常不错的选择。恰巧,Dubbo Spring Cloud给了我们这种选择的实现方式。

SpringCloud+Nacos+Dubbo整合实战下面将会以一个简单的入门案例,介绍一下在使用Nacos作为服务中心,使用Dubbo来实现服务提供方和服务消费方的案例。(1)服务端接口契约定义创建普通Maven项目dubbo-sample-api,定义服务端与消费端的接口契约。该项目仅是用于定义Dubbo服务端与消费端的接口契约。这里创建仅为更好的代码重用以及接口、模型规格控制管理。然后打包成jar包,安装到私有仓库,供客户端与Dubbo服务端接口实现的项目来依赖使用。pom.xml不用引用任何包。

定义服务端接口类IHelloService:

package com.zxy.dubbo_sample_api;

public interface IHelloService { String sayHello(String name);}然后执行mvn install,将dubbo-sample-api添加到本地仓库,供其他项目依赖。

(2)服务端服务实现创建一个SpringBoot项目dubbo-sample-provider。该项目实现上面定义好的接口,并该项目作为服务注册到服务注册中心,这里采用nacos,也可以采用ZooKeeper,而且dubbo还可以支持多注册中心。工程依赖pom.xml如下:

4.0.0

com.zxy dubbo-sample-provider 1.0 org.springframework.boot spring-boot-starter-parent 2.3.7.RELEASE 1.8 Hoxton.SR10 2.2.5.RELEASE org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring-cloud-alibaba.version} pom import

org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-devtools true com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-starter-dubbo org.springframework.boot spring-boot-starter-actuator com.zxy dubbo-sample-api 1.0 注意:必须包含spring-boot-starter-actuator包,不然启动会报错。pom中引入定义服务契约接口的API模块的包。

实现Dubbo接口IHelloService,新建HelloServiceImpl类,代码如下:package com.zxy.dubbo_sample_provider.service;import com.zxy.dubbo_sample_api.IHelloService;import org.apache.dubbo.config.annotation.DubboService;

@DubboServicepublic class HelloServiceImpl implements IHelloService { public String sayHello(String name){ return "Hello World:"+ name; }}注意:这里的@DubboService注解是Dubbo的org.apache.dubbo.config.annotation.DubboService,千万不要引用错误。@DubboService注解仅声明该Java服务(本地)实现为Dubbo服务。旧版本的dubbo使用该包下的@Service直接,后来为了防止与spring混淆改为了@DubboService。

配置文件application.properties,将Java服务(本地)配置为Dubbo服务(远程)如下:

#Spring应用名称,用于SpringCloud服务注册和发现。该值在Dubbo Spring Cloud加持下被视作dubbo.application.name,因此,无需再显示地配置dubbo.application.name。spring.application.name=dubbo-sample-providerserver.port=3001

#Dubbo服务实现类的扫描基准包路径dubbo.scan.base-packages=com.zxy.dubbo_sample_provider.service#Dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始)#因为项目中存在多个服务提供端比如商品服务、会员服务等,这里为了方便设置为了-1dubbo.protocol.name=dubbodubbo.protocol.port=-1#Dubbo服务注册中心的配置地址,它的值spring-cloud://localhost表示挂载到Spring Cloud注册中心,不配置的话会提示没有配置注册中心的错误。dubbo.registry.address=spring-cloud://localhost

#nacos#spring.cloud.nacos.discovery定义Nacos服务发现与注册配置,其中子属性server-addr指定Nacos服务器主机和端口。spring.cloud.nacos.discovery.server-addr=localhost:8848注意:在暴露Dubbo服务方面,推荐使用外部化配置的方式,即指定Java服务实现类的扫描基准包。

Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注@DubboComponentScan来实现基准包扫描。创建应用主类,即项目入口DubboSampleProviderApplication.java文件。如果使用SpringBoot自动创建项目该文件是自动创建的不用做任何修改。

package com.zxy.dubbo_sample_provider;

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplicationpublic class DubboSampleProviderApplication {

public static void main(String[] args) { SpringApplication.run(DubboSampleProviderApplication.class, args); }

}运行dubbo-sample-provider项目,将会在Nacos中注册服务。(注意:在运行项目前,先安装并启动Nacos服务端)

(3)消费端(客户端)实现

创建一个SpringBoot项目dubbo-consumer,实现调用以上的服务。工程依赖pom.xml:

4.0.0

com.zxy dubbo-consumer 1.0

org.springframework.boot spring-boot-starter-parent 2.3.7.RELEASE

1.8 Hoxton.SR10 2.2.5.RELEASE

org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring-cloud-alibaba.version} pom import

org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-devtools true org.springframework.boot spring-boot-starter-web com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-starter-dubbo org.springframework.boot spring-boot-starter-actuator

com.zxy dubbo-sample-api 1.0

org.springframework.boot spring-boot-maven-plugin 注意:pom中一定要引入定义服务契约接口的API模块的包dubbo-sample-api。

工程配置application.properties:

#服务名称spring.application.name=dubbo-consumerserver.port=4001

#表示要订阅服务的服务名,可以配置'*'代表订阅所有服务(不推荐使用)。若需订阅多应用,使用","分割。dubbo.cloud.subscribed-services=dubbo-sample-provider

#nacosspring.cloud.nacos.discovery.server-addr=localhost:8848#禁止该服务注册到Nacos服务列表中spring.cloud.nacos.discovery.register-enabled=false实现服务调用,新建HelloController.java类:

package com.zxy.dubbo_consumer.control;

import com.zxy.dubbo_sample_api.IHelloService;import org.apache.dubbo.config.annotation.DubboReference;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;

@RestControllerpublic class HelloController {

@DubboReference private IHelloService helloService;

@GetMapping("/say") public String sayHello(){ return helloService.sayHello("Lily"); }}注意:这里的@DubboReference注解是Dubbo的org.apache.dubbo.config.annotation.DubboReference,千万不要引用错误。

手写过RPC框架的同学,应该都知道,客户端通过服务端的接口契约可以调用服务端的接口,其实是采用动态代理的方式,dubbo中默认采用javasist,大家不妨debug一下。@DubboReference作用就是将动态代理注入进来。创建应用主类,即项目入口DubboConsumerApplication.java文件。如果使用SpringBoot自动创建项目该文件是自动创建的不用做任何修改。

package com.zxy.dubbo_consumer;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class DubboConsumerApplication { public static void main(String[] args) { SpringApplication.run(DubboConsumerApplication.class, args); }}(4)测试:

启动Nacoe、启动服务提供项目dubbo-sample-provider、服务消费项目dubbo-consumer、确保接口契约项目已经添加到maven本地仓库中。启动完成后,我们可以访问Nacos控制台的服务列表上已经注册的以上服务。具体参照之前的步骤。我们打开浏览器访问:http://localhost:4001/say,可以看到页面正常显示Hello World:Lily!表示测试成功。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3