搭建SpringCloud-Alibaba框架

简介

搭建基于SpringcloudAlibaba的分布式框架,注册中心以及服务消费订阅采用的是中间件 Nacos作为实现,服务与服务之间的调用采用的是dubbo的rpc协议,各模块通过 Nacos进行统一的配置管理(通过Nacos做配置中心),当并发进行http接口调用时,则是采用中间件Sentinel进行服务限流以及服务降级,http请求响应数据则是从数据库 mysql 中获取,最后通过springcloud的插件gateway进行路由转发。本篇将略微有点长,请耐心看完。

项目地址:https://gitee.com/wangwenlongGitHub/SpringCloudAlibaba-practice.git

Nacos、Sentinel安装与简介:https://blog.csdn.net/qq_42227281/article/details/109074957

工程搭建:

1:父工程及子工程

1、创建一个Maven项目作为父工程

src等没用的文件直接删除,只留关键的pom即可

2、创建子工程(maven工程)alibaba-module、alibaba-server、alibaba-common

src等没用的文件直接删除,只留关键的pom即可

3、alibaba-module--Pom文件

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>SpringCloudAlibaba-practice</artifactId>
        <groupId>com.jingshang</groupId>
        <version>1.0</version>
    </parent>

    <artifactId>alibaba-module</artifactId>
    <packaging>pom</packaging>
    <description>module模块</description>

    <modules>
        <module>admin-user-biz</module>
        <module>admin-user-api</module>
        <module>admin-role-api</module>
        <module>admin-role-biz</module>
    </modules>
</project>

alibaba-module子工程:我用它来管理api接口、http接口

4、alibaba-server--Pom文件

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jingshang</groupId>
    <artifactId>alibaba-server</artifactId>
    <packaging>pom</packaging>
    <version>1.0</version>

    <modules>
        <module>alibaba-gateway-server</module>
    </modules>
</project>

alibaba-server子工程:我用它来管理路由转发、服务降级、限流等功能模块

5、alibaba-common--Pom文件

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>SpringCloudAlibaba-practice</artifactId>
        <groupId>com.jingshang</groupId>
        <version>1.0</version>
    </parent>

    <artifactId>alibaba-common</artifactId>
    <packaging>pom</packaging>
    <description>common模块</description>

    <modules>
        <module>common-core</module>
        <module>common-code-generation</module>
    </modules>


</project>

alibaba-common子工程:我通常用来整合安全框架、代码生成等公共功能模块

2:整合Nacos注册中心、服务提供者、配置中心。整合sentinel

服务提供者

在alibaba-module工程中中创建 admin-user-api、admin-user-biz等子工程

说明:api为对外开放的接口、biz为http接口,通俗的讲就是postman可调用的接口。远程调用我是用的dubbo的rpc协议来替代feign和ribbon

1、创建 admin-user-api 模块:右键alibaba-module->new->module->创建maven项目

构建Pom:pom

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>alibaba-module</artifactId>
        <groupId>com.jingshang</groupId>
        <version>1.0</version>
    </parent>


    <artifactId>admin-user-api</artifactId>
    <packaging>jar</packaging>
    <description>user模块</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>


</project>

2、创建 admin-user-biz 模块:右键alibaba-module->new->module->创建springboot项目

构建Pom:pom

<?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.jingshang</groupId>
    <artifactId>admin-user-biz</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 引入Api -->
        <dependency>
            <groupId>com.jingshang</groupId>
            <artifactId>admin-user-api</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- 公共Api-->
        <dependency>
            <groupId>com.jingshang</groupId>
            <artifactId>common-core</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <!-- 必须包含spring-boot-starter-actuator包,不然启动会报错。 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- web 应用 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 配置中心所需jar包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- 整合的dubbo -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <!-- 整合的nacos -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- sentinel -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <optional>true</optional>
        </dependency>
        <!--  junit 测试所需的jar包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.properties配置

spring.application.name=admin-user-biz
server.port=8001
# sentinel dashboard
spring.cloud.sentinel.transport.dashboard=10.10.10.244:8888
#nacos 注册中心
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=dddf9ef6-638a-42fa-9b82-9c61a944f6cc
#spring.cloud.nacos.discovery.cluster‐name=DEFAULT_GROUP
# dubbo 服务
dubbo.scan.base-packages=com.jingshang.adminuserbiz.service
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881
dubbo.registry.address=spring-cloud://localhost
#订阅 (意思是调用哪个web服务的接口)
#dubbo.cloud.subscribed-services=admin-user-biz
#mysql日志
logging.level.com.jingshang.adminuserbiz.dao=debug

注:mysql配置到了nacos中,application.properties中就不再重复写mysql的连接了,如何将mysql配置到nacos中请继续往下看

说明:application.properties中配置了nacos注册中心、sentinel流量防卫兵等基本配置、rpc远程调用协议【dubbo】

重点:当你配置了dubbo之后,Service层的注解要使用 dubbo的@Service注解,当你非要使用 @org.springframework.stereotype.Service的 @Service注解时,请一定保证当前服务没有被其他服务远程调用。否则调用此服务的服务消费者启动时将会抛出【No provider available for the service 】 翻译过来就是:没有提供该服务的提供商

2.1、构建nacos配置中心

①登录:默认账号密码都是 nacos。地址:http://localhost:8848/nacos

②进去后选择:【服务管理】-->【命名空间】-->【点击右上角:新建命名空间】

效果图:

④新增配置信息:选择列表页的 【配置管理】-->【选择上方刚创建的dev命名空间】-->【点击右上方的 + 号】Id、group、配置内容为必填信息。 配合格式我springboot项目中用的是properties,所以这里选properties就可以了,主要是和代码的配置文件后缀保持一致即可

我这里只配了 数据库,各位小伙伴根据自己实际情况做配置​​​​​​​

⑤bootstrap.properties拉取配置中心信息的配置

#配置中心
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.prefix=alibaba-admin-database
spring.cloud.nacos.config.group=DEFAULT_DATABASE
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.namespace=dddf9ef6-638a-42fa-9b82-9c61a944f6cc
# 修改nacos日志打印级别,不修改的话,配置信息一直刷新
logging.level.com.alibaba.nacos:warn

yaml格式

logging:
  level:
    com:
      alibaba:
        nacos: warn
spring:
  cloud:
    nacos:
      config:
        file-extension: properties
        group: DEFAULT_DATABASE
        namespace: dddf9ef6-638a-42fa-9b82-9c61a944f6cc
        prefix: alibaba-admin-database
        server-addr: localhost:8848

bootstrap.properties的属性与nacos的对应关系

说明:为什么这里要创建两个配置文件,为什么不直接在application.properties中配置所有所需信息呢。这是因为nacos做配置中心的时候,默认支持的是bootstrap,而不是application,不这么做的话, 你的配置就算写的再好,也不会将其放到nacos中做配置中心的,而且会导致启动找不到配置而报错

重点:bootstrap.properties通过namespace【namespace的指向是命名空间,如果不写的话,默认去找public命名空间,但是这样的话,配置就找不到了(我们在配置中心配置的数据库信息)】和prefix【prefix它指定的配置的Id】,通过这两个属性,使得配置文件 能精准的找到属于我们自己的配置信息

⑥nacos多配制

前提:需要有一个默认配置,该默认配置需要指定【命名空间:namespace、nacos地址:server-addr】

多配制:当你需要从nacos配置中心拉取多个配置时,应该在bootstrap.properties配置文件中配置【data-id、group】如下图圈红的位置

⑦ 如需多配制请在bootstrap.properties中这么写:

spring.cloud.nacos.config.ext-config[0].data-id=alibaba-admin-database.properties

spring.cloud.nacos.config.ext-config[0].group=DEFAULT_DATABASE

yaml格式

spring:
  cloud:
    nacos:
      config:
        ext-config:
        - data-id: alibaba-admin-database.properties
          group: DEFAULT_DATABASE

重点:值得注意的是data-id 一定要加扩展名,当你不加它的时候,系统还是会提醒你,让你选择一个合适的扩展名,至于为什么系统会这么贴心的告诉你呢? 那是因为它报错给我们了 【 报错信息:must contains file extension with properties|yaml|yml 】

误区:ext-config[0]我当时在想为什么是【0】,如果没有【0】的情况下,我可不可以直接写【1】百思不得其解,但是当我看到源码的时候我才突然恍然大悟

/**
 * 一组扩展配置
 */
private List<Config> extConfig;

这个配置的容器是List,而List索引必须从0开始,所以当你需要多配制的时候,要从0开始,然后才是1、2、3

配置好后启动查看控制台日志输出,如下图:加载了两个配置

⑧启动类添加注解

@MapperScan(basePackages = {"com.jingshang.adminuserbiz.dao"})
@EnableDiscoveryClient//将服务注册到注册中心
@SpringBootApplication
public class AdminUserBizApplication {

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

}

2.1:编写http接口、并进行流控及降级

①Mapper层省略、写sql语句的时候,启动类记得扫描哟或者在Mapper层加注解

②Service层:接口写在 admin-user-api 里面,如下图

接口方法:String findByName(Integer id); id查询返回名称,这方法名起的不咋地,能懂意思就行哈,不要太在意我起的名字​​​​​​​

③Service实现类:该实现类放在 admin-user-biz 里面。如下图。如果不明白api、zip的区别,请往上看,上面有说明。​​​​​​​

④接口方法:

@Slf4j
@Service
public class UserServiceImpl implements UserDubboService {


    @Resource
    private UserDao sysUserDao;

    @SentinelResource(value = "user/findByName", blockHandler = "exceptionHandler")
    @Override
    public String findByName(Integer id) {
        return sysUserDao.findByName(id);
    }
}

重点:

1、@Service注解使用 dubbo的注解,且一定要实现接口

2、@SentinelResource它是sentinel的注解(用于服务限流、降级、服务熔断)

用于定义资源,并提供可选的异常处理和 fallback 配置项。

@SentinelResource 注解包含以下属性:

value:资源名称,必需项(不能为空)

entryType:entry 类型,可选项(默认为EntryType.OUT)

blockHandler(命名块的异常功能) 、 blockHandlerClass (指定自定义限流及降级的类)

3、Sentinel限流、降级的使用

一:流控

①先请求接口,因为只有请求完接口后,sentinel的簇点链路才有该路径,才可以进行限流​​​​​​​

②打开sentinel 簇点链路->列表视图->找到刚调用的接口地址->点击流控​​​​​​​

QPS:点击数

单机阈值:单位时间内QPS和线程数的数量

线程数:跟QPS很像,理解直观意思即可

关联:比如A接口地址为资源名、B接口地址为关联的资源名,当A接口限流后,B接口也会被限流

Warm Up:预热模式,该加载因子默认是3,意思是当QPS(点击数)设置每秒10次,warm up设置5秒,那就是在5秒内处于预热模式。每秒的并发是 QPS/加载因子、10/3 ,也就是说在预热模式内(warm up = 5秒)并发最多是3,当大于3的时候就会进行流量控制

排队等候:这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态, 我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

注意:匀速排队模式暂时不支持 QPS > 1000 的场景。

注意 :自定义的流量控制异常请参考上面接口实现类里的方法

二:降级

①先请求接口,因为只有请求完接口后,sentinel的簇点链路才有该路径,才可以进行降级

②打开sentinel 簇点链路->列表视图->找到刚调用的接口地址->点击降级

注意:降级规则1.8之后更新了策略

RT:平均响应时间,当rt设置为200毫秒时则表示,单位时间内的的请求平均响应时间必须在200毫秒以内完成,若超出则会触发降级

时间窗口:被降级后的资源将在时间窗口后恢复正常

异常比例:单位时间内的请求,当报错达到一定比例后服务将会自动降级(例:每秒请求10次,异常比例设置为20%,那么10次请求中报错超过3次,报错就会 超过20%,一旦超过,sentinel就会进行服务熔断)

异常数:这个相对于前两个就比较好理解一些了,直接设置好报错的次数,当报错次数超过设置的异常数时,就会自动降级

注意 :自定义的服务降级异常请参考上面接口实现类里的方法,与流控的自定义异常写法可以保持一致,关键点在sentinel Dashbord对于该资源是设置了限流还是降级

2.2 服务消费者

服务消费者

1、创建 admin-role-api 模块:右键alibaba-module->new->module->创建maven项目

构建Pom:

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>alibaba-module</artifactId>
        <groupId>com.jingshang</groupId>
        <version>1.0</version>
    </parent>


    <artifactId>admin-role-api</artifactId>
    <packaging>jar</packaging>
    <description>role模块</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

</project>

2、创建 admin-role-biz 模块:右键alibaba-module->new->module->创建springboot项目

构建Pom:

<?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.jingshang</groupId>
    <artifactId>admin-role-biz</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 引入Api -->
        <dependency>
            <groupId>com.jingshang</groupId>
            <artifactId>admin-role-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.jingshang</groupId>
            <artifactId>admin-user-api</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <!-- 必须包含spring-boot-starter-actuator包,不然启动会报错。 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- web 应用 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 整合的dubbo -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <!-- 整合的nacos -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 配置中心所需jar包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- sentinel -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <optional>true</optional>
        </dependency>
        <!--  junit 测试所需的jar包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.properties基本配置

spring.application.name=admin-role-biz
server.port=8002
# sentinel dashboard (限流、熔断降级)
spring.cloud.sentinel.transport.dashboard=10.10.10.244:8888
#nacos 注册中心
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=dddf9ef6-638a-42fa-9b82-9c61a944f6cc
# dubbo 服务
#dubbo.scan.base-packages=com.jingshang.adminrolebiz.service
dubbo.protocol.name=dubbo
dubbo.protocol.port=20882
dubbo.registry.address=spring-cloud://localhost
#订阅 (意思是调用哪个web服务的接口)
dubbo.cloud.subscribed-services=admin-user-biz
#mysql日志
logging.level.com.jingshang.adminrolebiz.dao=debug

bootstrap.properties拉取配置中心的配置,这里跟服务提供者保持一致,都是拉取的同一个数据库的配置,这里就不重新粘贴代码了,小伙伴可直接复制服务提供者的bootstrap.properties中的配置,我这里只在nacos中配置了数据库,其他配置根据小伙伴们的个人需求进行编写

启动类添加@EnableDiscoveryClient注解

注:搭建消费者的方法与提供者步骤相同,这里不再赘述​​​​​​​

3、消费提供者提供的方法​​​​​​​

serviceImpl

package com.jingshang.adminrolebiz.service;

import com.jingshang.adminuserapi.dubbo.UserDubboService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;


/**
 * @Author: 王文龙
 * @Date: 2020/9/914:21
 * @Version: 1.0
 * @Describe: 描述:
 */
@Component
public class RoleServiceImpl {


    @Reference
    UserDubboService dubboService;//dubbo服务


    public String findByName(Integer id) {
        return dubboService.findByName(id);
    }
}

注入服务提供者时,要使用dubbo的@Reference注解,我个人远程调用是用的dubbo的rpc协议,如果远程调用使用的的feign的话就另当别论了

注:因为我这里没有实现接口,所以不需要@Service注解,但需要 @Component注解,而且application.properties也不可以让dubbo去扫描service包,在你妹使用dubbo的@Service注解的时候,配置里去扫描service包是会报错的,所以这里注意一下

controller

package com.jingshang.adminrolebiz.controller;

import com.jingshang.adminrolebiz.service.RoleServiceImpl;
import com.jingshang.adminuserapi.dubbo.UserDubboService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @Author: 王文龙
 * @Date: 2020/9/914:25
 * @Version: 1.0
 * @Describe: 描述:
 */
@RestController
@RequestMapping("/role")
public class RoleController {


    @Resource
    private RoleServiceImpl roleService;

    @RequestMapping("/findByName")
    public String findByName(Integer id) {
        return roleService.findByName(id);
    }
}

5、PostMan调用接口

!!!! 关于服务注册、订阅、配置、限流、降级就到此结束了​​​​​​​

猜你喜欢

转载自blog.csdn.net/qq_42227281/article/details/109067633