springboot整合dubbo

chy_18883701161      2022-05-05     181

关键词:

 

Dubbo是阿里开源的一个微服务框架,性能很高,现在由Apache维护。

 

Dubbo的架构:

http://dubbo.apache.org/zh-cn/docs/user/preface/architecture.html

 

此处写一个demo,订单服务获取订单所属用户的信息,order-service调用user-service。

 

 


 

 

 

1、新建子模块api,groupId为com.chy.mall,artifactId为api

这个模块用来存放微服务中所有的实体类,以及所有的服务提供者提供的服务接口。

只写实体类和接口,使用普通的maven项目即可。

 

(1)pom.xml

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
    </dependency>

 我要使用lombok,添加lombok的依赖

 

 

(2)新建包model,用于存放所有的model。包下新建实体类User:

//注意:实体类要可序列化
@Getter
@Setter
public class User implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private String tel;
    private String address;
}

 

 

(3)新建包service,用于存放所有服务提供者提供的服务接口。包下新建UserService:

public interface UserService {
    User findUserById(Integer id);
}

 

 

建包的方式有很多,比如用户服务要提供很多接口,可以在service下新建包user-service;

比如一个服务提供者一个包,user-service包下新建model包、service包,分别放本服务的model、提供的服务接口。

 

之所以把model写在这个子模块中,是因为服务接口的参数类型、返回值类型很多都要声明为实体类。

 

 

(4)使用maven install打包为jar安装到本地仓库,实际开发是安装到公司私服。

如果后续要更新、维护这个jar包,实际开发是以新版本号的方式来开发、安装,要使用新的jar包需要改pom.xml中的版本号;

自己操作的话,可以直接在原来代码的基础上改(使用原版本号),然后安装覆盖掉仓库中原来安装的jar包。

 

 

 

 

2、新建子模块user-service,springboot项目,作为服务提供者。groupId为com.chy.mall,artifactId为user-service

(1)pom.xml

   <!-- api接口的jar包 -->
    <dependency>
        <groupId>com.chy.mall</groupId>
        <artifactId>api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <!-- dubbo的依赖 -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.6</version>
    </dependency>

    <!-- zk的依赖 -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <version>2.7.6</version>
        <type>pom</type>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

 

使用zk作为注册中心、配置管理中心,这里添加的zk依赖是作为zkCli。

zk的依赖要用<exclusions>去掉slf4j部分,因为spring-boot-strat已经包含了slf4j,如果不去掉会报错:slf4j绑定了多个jar包中的Logger......

像这种多处引入同一个依赖的,用maven看一下依赖关系图,重复的保留一个即可。

 

 

dubbo可以使用多种注册中心,比如zk、redis等,上面的zk依赖只包含以zk作为注册中心的依赖,服务只能以zk作为注册中心。

zk的依赖可以换为以下2种中的任一种,均包含了dubbo支持的所有的注册中心的依赖:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.6</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.8</version>
</dependency>

 

 

(2)新建包service,包下新建类UserServiceImpl实现服务接口UserService

//此处的@Service是dubbo下的注解,不是spring的注解
@Service
public class UserServiceImpl implements UserService {
    @Override
    public User findUserById(Integer id) {
        User user = new User();
        user.setId(id);
        user.setUsername("chy");
        return user;
    }
}

实现服务接口的类都放到一个包下。

 

 

(3)配置文件

spring.application.name=user-service
#如果指定了spring应用名称,可以缺省dubbo的应用名称,这2个至少要配置1个。缺省dubbo的应用名称时默认值是spring的应用名称
#dubbo.application.name=user-service

#注册中心地址 dubbo.registry.address=zookeeper://192.168.1.9:2181 #端口号可以写在address中,也可以单独写。实质是从address中获取的port是null,后面设置的port覆盖了null #dubbo.registry.port=2181
#指定dubbo使用的协议、端口 dubbo.protocol.name=dubbo dubbo.protocol.port=20880
#指定注册到zk上超时时间,ms dubbo.registry.timeout=10000
#指定实现服务(提供服务)的包 dubbo.scan.base-packages=com.chy.user.service

 

连接到zkServer的时间开销大,如果不将注册的超时时间设置大一些,可能会报错:zookeeper not connected,时间不够,还没连上就超时取消了。

 

提供服务的包也可以引导类上指定:

@SpringBootApplication
// @EnableDubbo  //会扫描所有的包,从中找出dubbo的@Service标注的类
// @DubboComponentScan(basePackages = "com.chy.user.service")  //只扫描指定的包
public class UserServiceApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
    
}

可以在配置文件中配置,也可以使用上面2个注解中的一个。

 

  

 

 

3、新建子模块order-service,springboot web项目,作为服务消费者。groupId为com.chy.mall,artifactId为order-service

(1)pom.xml

   <!-- api接口的jar包 -->
    <dependency>
        <groupId>com.chy.mall</groupId>
        <artifactId>api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <!-- dubbo的依赖 -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.6</version>
    </dependency>

    <!-- zk的依赖 -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <version>2.7.6</version>
        <type>pom</type>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

 web项目自然要有spring-boot-start-web。

 

 

(2)新建包controller,包下新建类OrderController来调用服务

@Controller
public class OrderController {
    @Reference  //注入要调用的服务
    private UserService userService;

    @RequestMapping("/user/{id}")
    @ResponseBody
    public User getUser(@PathVariable Integer id){
        //调用服务
        User user= userService.findUserById(id);
        return user;
    }
    
}

一般是在service层调用服务,此处只是demo

 

 

(3)配置文件

#应用名称
spring.application.name=order-service
#dubbo.application.name=order-service

#注册中心地址 dubbo.registry.address
=zookeeper://192.168.1.9:2181 #dubbo.registry.port=2181
#协议、端口 dubbo.protocol.name
=dubbo dubbo.protocol.port=20880
#连接zk的超时时间,ms dubbo.registry.timeout
=10000
#启动应用时是否检查注册中心上有没有依赖的服务,默认true #dubbo.consumer.check
=false

 

缺省dubbo.consumer.check配置时,默认为true,要检查。

消费者连接注册中心时,会订阅要调用的服务,如果提供该服务的服务器一台都没有,会报错,这个消费者无法启动,这样在消费者启动时就能检查到是否有可用的生产者,提前发现问题。

调试时,如果先启动消费者,后启动|未启动生产者,消费者往往启动不了,报错:创建不了xxx bean,因为 Injection of @Reference dependencies is failed ,没有生产者提供该服务。

 设置为false,消费者启动时不检查,就算没有生产者提供该服务,消费者也能正常启动,只是调用该服务时会出错。

 

 

 

 

4、先启动生产者,再启动消费者

地址栏输入  http://127.0.0.1:8080/user/1  看到已经输出user对象信息

 

zkServer上,dubbo的根目录是/dubbo,

一个提供的服务对应一个znode,包名.服务接口名  的形式,/dubbo/service.UserService

这个节点的子节点providers存储此服务的所有提供者的注册信息,子节点consumers存储订阅此服务的所有消费者的信息。

 

dubbo @Service标注的类所实现的接口,会自动在zkServer上创建一个对应的znode,包名.接口名的形式;

生产者实现该接口,并使用dubbo @Service标识该类是服务提供者,实现的接口就是它提供的服务;消费者使用@Reference来订阅、引用服务。

 

 


 

 

 

说明

官方文档是在spring中使用dubbo,使用xml文件配置。

dubbo的配置可以写在springboot配置文件中,也可以在resources下新建spring配置文件,来写dubbo的配置。

 

 

dubbo配置加载流程:

http://dubbo.apache.org/zh-cn/docs/user/configuration/configuration-load-process.html

 

 

dubbo的协议有很多种,最常用的是dubbo协议:

http://dubbo.apache.org/zh-cn/docs/user/references/protocol/introduction.html

 

 

dubbo的注册中心也有很多种,设置可以不要注册中心,消费者可以通过ip、port直连提供者,直接调用。

一般使用zk作为注册中心。

 

 

dubbo一般使用20880端口,可以改,

消费者、生产者使用的端口可以相同,也可以不同。

 

 

集群容错:

http://dubbo.apache.org/zh-cn/docs/user/demos/fault-tolerent-strategy.html

调用服务时,如果调用失败,默认会重试2次,总共3次。

 

springboot和dubbo整合

创建3个项目dubbo-api新建一个maven项目,这个项目只有接口(或实体类)dubbo-service和dubbo-web这两个依赖于dubbo-api<groupId>com.zhang</groupId><artifactId>dubbo-api</artifactId><version>1.0</version>& 查看详情

springboot与dubbo整合

1.添加依赖 <!--SpringBootDubbo依赖--> <dependency> <groupId>io.dubbo.springboot</groupId> <artifactId>spring-boot-starter-dubbo</artifactId> <version>$dubbo 查看详情

dubbo入门学习-----dubbo整合springboot(代码片段)

springboot节省了大量的精力去配置各种bean,因此通过一个简单的demo来整合springboot与dubbo一、创建boot-user-service-provider本篇博文基于上篇中的dubbo项目,整体工程如下:1、pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven... 查看详情

dubbo整合springboot

目前的dubbo已支持和springboot集成,还是之前的例子,这次我们通过springboot容器来实现。借此了解一下基于springboot容器启动的dubbo的配置及使用。1.准备工作创建一个Maven空项目,作为项目的父工程,此工程的子项目基于SpringBoot2.0... 查看详情

springboot整合dubbo

一、导入依赖  二、生产者provider  (1)目录展示        (2)配置文件application.properties        (3)DoSomeService接口     packagecom.zn.service;publicinterfaceDoSomeService{publicStringsayHi();}  (4)DoSomeService... 查看详情

dubbo与springboot的三种整合方式

SpringBoot与dubbo整合的三种方式:1、导入dubbo-starter,在application.properties配置属性,使用@Service暴露服务,使用@Reference引用服务,使用@EnableDubbo开启dubbo注解(或者在application.properties中配置dubbo.scan.base-packages=com.lina02.gmall)2、保留 查看详情

springboot整合dubbo案例(代码片段)

使用框架:jdk1.8springboot-2.1.3dubbo-2.6spring-data-jpa-2.1.5一、开发dubbo服务接口:按照Dubbo官方开发建议,创建一个接口项目,该项目只定义接口和model类;1、创建springboot工程spring-boot-demo-dubbo-interface坐标:<groupId>com.example</groupI... 查看详情

springboot整合dubbo

 Dubbo是阿里开源的一个微服务框架,性能很高,现在由Apache维护。 Dubbo的架构:http://dubbo.apache.org/zh-cn/docs/user/preface/architecture.html 此处写一个demo,订单服务获取订单所属用户的信息,order-service调用user-service。 &nbs... 查看详情

springboot整合dubbo和zookeeper

...就像调用本地服务一样简单。截至目前,Dubbo发布了基于SpringBoot构建的版本,版本号为0.2.0,这使得其与SpringBoot项目整合变得更为简单方便。而Zookeeper在这里充当的是服务注册中心的角色,我们将各个微服务提供的服务通过Dubbo... 查看详情

springboot整合dubbo

通过三个工程演示整合过程工程一:API工程:服务端与客户端共同需要引入的工程  pom:无特殊依赖,下边内容供服务端与客户端引用此工程使用<groupId>com.boot.dubbo.demo</groupId><artifactId>dubbo-api</artifactId><v... 查看详情

dubbo学习springboot整合dubbomybatismysql

dubbo-admin查看服务和服务提供方配置 服务消费方配置和web整合相对复杂一些,常出现的问题是Controller中有@Reference配置的属性 没注入进来而调用时报null异常   查看详情

springboot整合dubbo(yml格式配置)

yml文件如果只作为服务的消费者不用暴露端口号,扫描的包名根据自己service改dubbo:application:name:springboot-dubbo-demo#应用名registry:address:zookeeper://127.0.0.1:2181#zookeeper地址#port:2181#提供注册的端口protocol:name:dubboport:"20889"#dubbo服 查看详情

springboot整合dubbo

导入依赖  生产者provider目录  接口IDoSomeService 实现类 IDoSomeServiceImpl  配置文件application.properties  测试类DubboProvider消费者consumer目录  接口类IDoSomeService&n 查看详情

dubbo学习——springboot整合dubbo(代码片段)

...中获取到所有的提供者/消费者进行配置管理。Dubboadminisaspringbootapplicat 查看详情

dubbo学习——springboot整合dubbo(代码片段)

...中获取到所有的提供者/消费者进行配置管理。Dubboadminisaspringbootapplicat 查看详情

一springboot整合dubbo光速入门

0、docker启动zkdocker-compose.ymlversion:'3'services:zoo1:image:zookeeperrestart:alwayshostname:zoo1ports:-2181:2181docker-composeup-d1、创建父pom<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns= 查看详情

springboot与dubbo整合的三种方式

...服务,使用@Reference来引用服务。具体可参考 Dubbo整合SpringBoot,这里截取部分代码方便理解。属性在application.properties中配置服务提供方使用@Service注 查看详情

springboot整合dubbo

生产者  结构        导入依赖    <dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.10</version></dependency><dependency>& 查看详情