1、Cloud、CloudAlibaba、Boot之间的版本关系
过去两年里,由于SpringCloud Netflix原先的一些组件进入停更维护状态,因此这些组件逐渐被一些新技术所替代,其中springCloud就是最受欢迎的微服务架构之一,下面是Netflix与alibaba之间的组件比较
组件 | SpringCloud | SpringCloudAlibaba |
---|---|---|
服务注册中心 | Eureka | Nacos |
配置中心 | Config | Nacos |
服务总线 | Bus | Nacos |
负载均衡 | Ribbon | LoadBalancer |
服务调用 | Feign | OpenFeign、Dubbo |
服务网关 | Zuul | gateway |
服务降级 | Hystrix | Sentinel |
2、工程搭建
springCloud工程基本采用maven聚合工程的模子去搭建,父工程按springboot工程创建,只留一个pom文件 其余全部删除即可,子工程按maven工程创建
2.1 父工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cloudalibaba.study</groupId>
<artifactId>spring-cloud-alibaba-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--parent标签在实际开发中 可用来继承公司基础包-->
<modules>
<module>provider</module>
<module>consumer</module>
<module>common-interface</module>
</modules>
<name>spring-cloud-alibaba-study</name>
<description>spring-cloud-alibaba-study</description>
<packaging>pom</packaging>
<properties>
<java.version>8</java.version>
<com.alibaba.cloud.version>2.2.3.RELEASE</com.alibaba.cloud.version>
<org.spring.cloud.version>Hoxton.SR8</org.spring.cloud.version>
<org.spring.boot.version>2.3.2.RELEASE</org.spring.boot.version>
</properties>
<dependencyManagement><!--使用management一次性依赖多个parent项目-->
<dependencies>
<!--springboot start依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${org.spring.boot.version}</version>
<!--添加type和scope标签 并设置为pom和import 要不子模块引不到这些依赖-->
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springCloudAlibaba 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${com.alibaba.cloud.version}</version>
<!--添加type和scope标签 并设置为pom和import 要不子模块引不到这些依赖-->
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springCloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${org.spring.cloud.version}</version>
<!--添加type和scope标签 并设置为pom和import 要不子模块引不到这些依赖-->
<type>pom</type>
<scope>import</scope>
<exclusions>
<!--因为后续要用dubbo去做远程调用 所以这里就把openfeign的依赖给排除掉-->
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
</project>
踩坑点
:注意标签里的描述,每一步都可能是一个踩坑点,总结一下就是打包方式、type标签、scope标签
2.2子工程
由于是demo练习 子工程一共有三个,生产者、消费者和公共模块,生产者和消费者不必多言,一个提供服务,一个引用服务,公共模块存放需要进行dubbo调用的接口和实体类
生产者工程依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-alibaba-study</artifactId>
<groupId>com.cloudalibaba.study</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<common.interface>1.0-SNAPSHOT</common.interface>
</properties>
<dependencies>
<!--公共模块-->
<dependency>
<groupId>org.llf</groupId>
<artifactId>common-interface</artifactId>
<version>${common.interface}</version>
</dependency>
<!--springboot-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>org.apache.httpcomponents</groupId>
</exclusion>
</exclusions>
</dependency>
<!--dubbo与springboot自动装配starter-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!--mysql-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--dubbo - > nacos注册-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.7</version>
<exclusions>
<exclusion>
<artifactId>nacos-client</artifactId>
<groupId>com.alibaba.nacos</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
消费者的依赖和它基本上和它不相上下,但是由于消费者不需要连接数据库,所以在消费者里就把mysql和mybatis的依赖移除了。
踩坑点
:如果dubbo-spring-boot-starter
的版本和dubbo-registry-nacos
的版本不一致,会导致在启动的时候报错某些包找不到,我当时是有一个StringUtils
的包死活找不到,找个大半天才知道了原来是版本问题,如果启动的时候报类似包找不到的错误,可以去aliyun仓库看看这个包还有没有其他的版本,多换几个试试
aliyun仓库地址
:仓库服务 (aliyun.com)
2.3 目录结构
- 公共模块
-
生产者
-
消费者
3、dubbo服务注册与调用
SCA默认使用openFeign作为通信中间件,他的使用方式和dubbo大差不差,都是在公共接口上通过添加注解进行远程调用,不过两者还是有一些区别的
- dubbo使用注解
dubboService
、dubboRefrence
注解进行服务注册与调用,而openFeign则是使用openFeignClient
注解进行服务调用,因为nacos自带服务注册,所以openFeign直接调用即可 - dubbo支持多种协议,例如http、rpc、dubbo等,而openFeign仅支持http协议
- dubbo支持的负载均衡策略比openFeign多,并且dubbo支持将负载均衡的粒度细化到某个接口
这里只是列举了几个,更多的差异可以参考 Dubbo 与 Feign 的区别_feign和dubbo_云川之下的博客-CSDN博客这篇文章
说了这么多,还是上代码吧! 我的Idea已经饥渴难耐了 哈哈哈
3.1生产者配置:
这里有两个配置,一个是application.yml 还有一个是bootstrap.yml 至于为什么 且往下看
#application.yml
server:
port: 8081
spring:
application:
name: provider-service
datasource:
driver-class-name: ${db.driver}
url: ${db.url}
username: ${db.username}
password: ${db.password}
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
type-aliases-package: ${aliases.package}
mapper-locations: ${mapper.location}
# dubbo configuration
dubbo:
registry:
address: nacos://192.168.131.1:8848
use-as-config-center: false #不使用配置中心 要不他会往配置中心注册一个当前application.name的配置
protocol:
name: dubbo
port: 20880
#bootstrap.yml
#如果nacos的配置文件的dataId和应用程序名字一致 且只引用nacos的一个配置文件 那么就可以不写这个bootstrap配置文件
#只需要在application.yml里声明nacos.discovery的server-addr属性即可
#如果配置文件的dataId和应用程序名字不一致或需要引用多个配置文件 那么就参考这个配置文件
spring:
application:
name: provider-service #应用名称
cloud:
nacos:
discovery:
server-addr: 192.168.131.1:8848 #nacos服务与发现地址
enabled: false #设置false 关闭nacos服务注册与发现 让dubbo自己往nacos进行注册
config:
server-addr: 192.168.131.1:8848 #nacos配置中心地址
group: DEFAULT_GROUP #配置组别 默认DEFAULT_GROUP
file-extension: properties #配置文件的格式 可以是yaml 、properties、text和json
refresh-enabled: true #刷新配置
shared-configs[0]:
data-id: common-config.properties #nacos配置中心的dataId 这里需要加配置的格式作为后缀
group: DEFAULT_GROUP
refresh: true
#shared-configs[1]: 如果需要引用多个nacos配置 那么就多配置几个shared-configs
# data-id: database-dev2.yaml
# group: DEFAULT_GROUP
# refresh: true
#ext-config[0]: ext-config 需要排除的nacos配置
# data-id: database-dev.yaml
# group: DEFAULT_GROUP
# refresh: true
use-as-config-center: false
因为dubbo在进行服务注册的时候,会默认将当前应用名字作为配置进行注册,这样的话,一启动项目,nacos配置中心列表就会多出来两个配置,一个是使用了dubboService
的配置,一个是当前项目名称
的配置,前置不用管,后者可以通过这个配置进行关闭
enabled: false
因为nacos自带了服务注册与发现,项目启动后,他会自动拉去服务进行注册,而我们dubbo也向里面手动注册了一份,这样的结果就是 注册中心里有两条配置 ,而我们只需要dubbo注册的服务,所以我们要将nacos的discovery属性设置为false,但是如果使用的是feign 就不需要冠了
3.2消费者配置
消费者和生产者配置差不多,只不过去掉数据库的配置即可
server:
port: 8082
spring:
application:
name: consumer-service
cloud:
nacos:
discovery:
enabled: false #设置false属性 不让nacos自己注册 让dubbo去注册
server-addr: 192.168.131.1:8848
group: DEFAULT_GROUP
# dubbo configuration
dubbo:
registry:
address: nacos://192.168.131.1:8848
use-as-config-center: false #不使用配置中心 要不他会往配置中心注册一个当前application.name的配置
protocol:
name: dubbo
port: 20880
通过postman发送请求 观察结果即可