SpringBoot整合Dubbo
2021-02-04 22:14
标签:rate 协议 web 管理 scan 实现 alibaba ide control Dubbo是阿里开源的一个微服务框架,性能很高,现在由Apache维护。 Dubbo的架构: http://dubbo.apache.org/zh-cn/docs/user/preface/architecture.html 此处写一个demo,订单服务获取订单所属用户的信息,order-service调用user-service。 这个模块用来存放微服务中所有的实体类,以及所有的服务提供者提供的服务接口。 只写实体类和接口,使用普通的maven项目即可。 (1)pom.xml 我要使用lombok,添加lombok的依赖 (2)新建包model,用于存放所有的model。包下新建实体类User: (3)新建包service,用于存放所有服务提供者提供的服务接口。包下新建UserService: 建包的方式有很多,比如用户服务要提供很多接口,可以在service下新建包user-service; 比如一个服务提供者一个包,user-service包下新建model包、service包,分别放本服务的model、提供的服务接口。 之所以把model写在这个子模块中,是因为服务接口的参数类型、返回值类型很多都要声明为实体类。 (4)使用maven install打包为jar安装到本地仓库,实际开发是安装到公司私服。 如果后续要更新、维护这个jar包,实际开发是以新版本号的方式来开发、安装,要使用新的jar包需要改pom.xml中的版本号; 自己操作的话,可以直接在原来代码的基础上改(使用原版本号),然后安装覆盖掉仓库中原来安装的jar包。 (1)pom.xml 使用zk作为注册中心、配置管理中心,这里添加的zk依赖是作为zkCli。 zk的依赖要用 像这种多处引入同一个依赖的,用maven看一下依赖关系图,重复的保留一个即可。 dubbo可以使用多种注册中心,比如zk、redis等,上面的zk依赖只包含以zk作为注册中心的依赖,服务只能以zk作为注册中心。 zk的依赖可以换为以下2种中的任一种,均包含了dubbo支持的所有的注册中心的依赖: (2)新建包service,包下新建类UserServiceImpl实现服务接口UserService 实现服务接口的类都放到一个包下。 (3)配置文件 连接到zkServer的时间开销大,如果不将注册的超时时间设置大一些,可能会报错:zookeeper not connected,时间不够,还没连上就超时取消了。 提供服务的包也可以引导类上指定: 可以在配置文件中配置,也可以使用上面2个注解中的一个。 (1)pom.xml web项目自然要有spring-boot-start-web。 (2)新建包controller,包下新建类OrderController来调用服务 一般是在service层调用服务,此处只是demo (3)配置文件 缺省dubbo.consumer.check配置时,默认为true,要检查。 消费者连接注册中心时,会订阅要调用的服务,如果提供该服务的服务器一台都没有,会报错,这个消费者无法启动,这样在消费者启动时就能检查到是否有可用的生产者,提前发现问题。 调试时,如果先启动消费者,后启动|未启动生产者,消费者往往启动不了,报错:创建不了xxx bean,因为 Injection of @Reference dependencies is failed ,没有生产者提供该服务。 设置为false,消费者启动时不检查,就算没有生产者提供该服务,消费者也能正常启动,只是调用该服务时会出错。 地址栏输入 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 标签:rate 协议 web 管理 scan 实现 alibaba ide control 原文地址:https://www.cnblogs.com/chy18883701161/p/12783892.html
1、新建子模块api,groupId为com.chy.mall,artifactId为api
dependency>
groupId>org.projectlombokgroupId>
artifactId>lombokartifactId>
version>1.18.12version>
dependency>
//注意:实体类要可序列化
@Getter
@Setter
public class User implements Serializable {
private Integer id;
private String username;
private String password;
private String tel;
private String address;
}
public interface UserService {
User findUserById(Integer id);
}
2、新建子模块user-service,springboot项目,作为服务提供者。groupId为com.chy.mall,artifactId为user-service
dependency>
groupId>com.chy.mallgroupId>
artifactId>apiartifactId>
version>1.0-SNAPSHOTversion>
dependency>
dependency>
groupId>org.apache.dubbogroupId>
artifactId>dubbo-spring-boot-starterartifactId>
version>2.7.6version>
dependency>
dependency>
groupId>org.apache.dubbogroupId>
artifactId>dubbo-dependencies-zookeeperartifactId>
version>2.7.6version>
type>pomtype>
exclusions>
exclusion>
groupId>org.slf4jgroupId>
artifactId>slf4j-log4j12artifactId>
exclusion>
exclusions>
dependency>
dependency>
groupId>org.apache.dubbogroupId>
artifactId>dubboartifactId>
version>2.7.6version>
dependency>
dependency>
groupId>com.alibabagroupId>
artifactId>dubboartifactId>
version>2.6.8version>
dependency>
//此处的@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;
}
}
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@SpringBootApplication
// @EnableDubbo //会扫描所有的包,从中找出dubbo的@Service标注的类
// @DubboComponentScan(basePackages = "com.chy.user.service") //只扫描指定的包
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
3、新建子模块order-service,springboot web项目,作为服务消费者。groupId为com.chy.mall,artifactId为order-service
dependency>
groupId>com.chy.mallgroupId>
artifactId>apiartifactId>
version>1.0-SNAPSHOTversion>
dependency>
dependency>
groupId>org.apache.dubbogroupId>
artifactId>dubbo-spring-boot-starterartifactId>
version>2.7.6version>
dependency>
dependency>
groupId>org.apache.dubbogroupId>
artifactId>dubbo-dependencies-zookeeperartifactId>
version>2.7.6version>
type>pomtype>
exclusions>
exclusion>
groupId>org.slf4jgroupId>
artifactId>slf4j-log4j12artifactId>
exclusion>
exclusions>
dependency>
@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;
}
}
#应用名称
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
4、先启动生产者,再启动消费者
说明