微服务
Dubbo
Apache Dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力
Dubbo 与 SpringCloud 的通信 Openfeign的区别
1、协议支持方面
- Feign更加优雅简单。Feign是通过REST API实现的远程调用,基于Http传输协议,服务提供者需要对外暴露Http接口供消费者调用,服务粒度是http接口级的。通过短连接的方式进行通信,不适合高并发的访问
- Dubbo方式更灵活。Dubbo是通过RPC调用实现的远程调用,支持多传输协议(Dubbo、Rmi、http、redis等等),可以根据业务场景选择最佳的方式,非常灵活。默认的Dubbo协议:利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景。Dubbo通过TCP长连接的方式进行通信,服务粒度是方法级的。
2、通信性能方面
- Feign基于Http传输协议,底层实现是rest。在高并发场景下性能不够理想。
- Dubbo框架的通信协议采用RPC协议,属于传输层协议,提升了交互的性能,保持了长连接,高性能。
Nacos
Nacos致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 与 Eureka 的选择
- Eureka 是 springcloud最早的注册中心,目前已经进入
停更维护
了 - Nacos 除了服务的注册发现之外,还支持动态配置服务。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷
搭建
一、创建父工程
1、新建父工程项目gateway_nacos_dubbo_springcloud
2、在build.gradle中配置项目依赖版本控制
plugins { id'java'id'org.springframework.boot'version'2.7.0'//springboot依赖版本id'io.spring.dependency-management'version'1.0.11.RELEASE'//spring的依赖管理插件版本} //版本控制ext { set('springCloudVersion', "2021.0.3") //SpringCloud依赖版本set('springCloudAlibabaVersion', "2021.0.1.0") //SpringCloudAlibaba依赖版本set('springBootVersion', "2.7.0") } //全部模块通用配置allprojects{ // 项目的默认名称和版本group='com.threesides'version='1.0.0-SNAPSHOT'// 指定JDK版本sourceCompatibility='11'// 指定仓库地址repositories { // aliyun镜像maven { url'https://maven.aliyun.com/repository/public' } maven { url'https://maven.aliyun.com/repository/google' } maven { url'https://maven.aliyun.com/repository/gradle-plugin' } maven { url'https://maven.aliyun.com/repository/spring' } maven { url'https://maven.aliyun.com/repository/grails-core' } maven { url'https://maven.aliyun.com/repository/apache-snapshots' } // 本地仓库mavenLocal() // 中央️仓库mavenCentral() } } // 子模块配置subprojects { // 使用插件applyplugin: 'java'applyplugin: 'org.springframework.boot'applyplugin: 'io.spring.dependency-management'//子模块通用依赖dependencies { testImplementation"org.springframework.boot:spring-boot-starter-test:${springBootVersion}"testRuntimeOnly"org.junit.jupiter:junit-jupiter-engine:${springBootVersion}" } //子模块依赖管理dependencyManagement { dependencies { dependency"org.springframework.boot:spring-boot-starter:${springBootVersion}" } imports { mavenBom"org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"mavenBom"com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}" } } }
二、创建网关 gateway
1、新建子工程项目demo-gateway
2、在build.gradle中引入启动器以及依赖
group'com.threesides'version'1.0.0-SNAPSHOT'jar.enabled=truebootJar.enabled=truedependencies { testImplementation'org.springframework.boot:spring-boot-starter-test'//测试环境testImplementation'org.junit.jupiter:junit-jupiter-api:5.7.0'testRuntimeOnly'org.junit.jupiter:junit-jupiter-engine:5.7.0'implementationgroup: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery'//注册中心,这里使用的是alibaba-nacos,其他注册中心也可implementationgroup: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-config'//配置中心,这里使用的是alibaba-nacosimplementation'org.springframework.cloud:spring-cloud-starter-gateway'//网关 gateway 项目不能同时依赖spring-boot-starter-webimplementation'org.springframework.cloud:spring-cloud-loadbalancer'// 负载均衡 SpringCloud 版本在 2021.0.x以上必须引依赖implementation'org.springframework.cloud:spring-cloud-starter-bootstrap'} test { useJUnitPlatform() }
3、启动类
publicclassGatewayApplication { publicstaticvoidmain(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
4、配置文件 bootstrap.yaml
server port1101spring application name demo-gateway cloud nacos discovery server-addr 127.0.0.18848
三、创建接口
1、新建子工程项目demo-interface
2、创建接口
publicinterfaceDemoInterface { publicStringdemo(Stringmessage); }
四、创建提供者
1、新建子工程项目demo-provider
2、在build.gradle中引入启动器以及依赖
group'com.threesides'version'1.0.0-SNAPSHOT'archivesBaseName="demo-provider"jar.enabled=truebootJar.enabled=truedependencies { // 引入本地的 xxxx模块implementationproject(':demo-interface') // 引入 spring-cloud 依赖// 注册中心,这里使用的是alibaba-nacos,其他注册中心也可。implementationgroup: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery'implementationgroup: 'org.springframework.boot', name: 'spring-boot-starter-web'//dubboimplementation'org.apache.dubbo:dubbo-spring-boot-starter:3.0.8'implementation'com.alibaba.nacos:nacos-client:2.1.0'// 由于我使用的客户端是2.1.0 //由于报错 java.lang.ClassNotFoundException: com.google.common.collect.Maps//引入guavaimplementation'com.google.guava:guava:31.1-jre'testImplementation'org.junit.jupiter:junit-jupiter-api:5.7.0'testRuntimeOnly'org.junit.jupiter:junit-jupiter-engine:5.7.0'} test { useJUnitPlatform() }
3、配置文件 application.yaml
server port8010# dubbo的配置dubbo application name demo-provider registry address nacos //127.0.0.18848
4、启动类
importorg.apache.dubbo.config.spring.context.annotation.EnableDubbo; publicclassProviderApplication { publicstaticvoidmain(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
5、提供者service 需要实现接口
importorg.apache.dubbo.config.annotation.DubboService; publicclassDemoProviderImplimplementsDemoInterface { publicStringdemo(Stringmessage) { System.out.println(message); returnmessage+"成功了"; } }
五、创建消费者
1、新建子工程项目demo-consumer
2、在build.gradle中引入启动器以及依赖
group'com.threesides'version'1.0.0-SNAPSHOT'archivesBaseName="demo-consumer"jar.enabled=truebootJar.enabled=truedependencies { // 引入本地的 xxxx模块implementationproject(':demo-interface') // 引入 spring-cloud 依赖// 注册中心,这里使用的是alibaba-nacos,其他注册中心也可。implementationgroup: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery'implementationgroup: 'org.springframework.boot', name: 'spring-boot-starter-web'//dubboimplementation'org.apache.dubbo:dubbo-spring-boot-starter:3.0.8'implementation'com.alibaba.nacos:nacos-client:2.1.0'// 由于我使用的客户端是2.1.0 //由于报错 java.lang.ClassNotFoundException: com.google.common.collect.Maps//引入guavaimplementation'com.google.guava:guava:31.1-jre'testImplementation'org.junit.jupiter:junit-jupiter-api:5.7.0'testRuntimeOnly'org.junit.jupiter:junit-jupiter-engine:5.7.0'} test { useJUnitPlatform() }
3、配置文件application.yaml
server port8011spring application name demo-consumer cloud nacos discovery server-addr http //127.0.0.1 8848 # 注册中心 http://ip:端口号dubbo registry address nacos //127.0.0.18848 registerfalse
4、启动类
importorg.apache.dubbo.config.spring.context.annotation.EnableDubbo; publicclassComsumerApplication { publicstaticvoidmain(String[] args) { SpringApplication.run(ComsumerApplication.class, args); } }
5、controller层
"/demo") (publicclassDemoConsumerController { privateDemoConsumerServicedemoConsumerService; "/getProviderService") (publicStringgetProviderService() { returndemoConsumerService.getProviderService(); } }
6、service层
importorg.apache.dubbo.config.annotation.DubboReference; publicclassDemoConsumerService { privateDemoInterfacedemoInterface; publicStringgetProviderService() { returndemoInterface.demo("使用Dubbo调用"); } }
7 、还有最后一步 需要配置网关策略配置
这里引入Nacos的配置中心的使用
- 在demo-gateway项目中引入依赖
implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-config'
- Nacos客户端添加配置
spring cloud gateway discovery locator enabled true #开启网关拉取nacos的服务 routesid demo-consumer uri lb //demo-consumer predicates Path=/demo/**
- 在demo-gateway项目的bootstrap.yaml配置文件中添加
spring cloud nacos config server-addr 127.0.0.18848 file-extension yaml refresh-enabled true # 是否动态刷新,默认为false# 支持多个共享dataId的配置,优先级小于extension-configs,shared-configs是一个集合 shared-configs[0]# 网关 通用配置可以定义在这个里面 dataId demo-gateway.yaml # 配置文件名dataId group DEFAULT_GROUP # 默认为DEFAULT_GROUP