1、Dubbo的前世今生
2011年10月27日,阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo,服务治理和SOA的设计理念开始逐渐在国内软件行业中落地,并被广泛应用。
- 早期版本的dubbo遵循SOA的思想,是面向服务架构的重要组件。
- 如今版本的Dubbo作为Spring Cloud的二进制通信方案来发挥Dubbo的性能优势
2、Dubbo的快速入门
2.1、Dubbo的基本架构
节点角色说明:
节点 | 角色说明 |
Provider | 暴露服务的服务提供方。 |
Consumer | 调用远程服务的服务消费方。 |
Registry | 服务注册与发现的注册中心。 |
Monitor | 统计服务的调用次数和调用时间的监控中心。 |
调用关系说明:
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
2.2、Nacos
Nacos是阿里巴巴的产品,是一个集服务发现,配置管理的平台,在国内受欢迎程度较高。
2、解压到没有中文和特殊字符的目录
3、进入bin目录,执行启动命令
#进入bin目录
cd bin
#启动
startup.cmd -m standalone
4、浏览器查看:http://127.0.0.1:8848/nacos
2.3、管理后台
DubboAdmin是阿里巴巴管理提供的管理控制台,可以实现服务查询,详情展示,服务测试等功能。借由DubboAdmin可以更好的帮助开发人员对服务进行管理和监控
#1、下载代码:
git clone https://github.com/apache/dubbo-admin.git
#2、在 dubbo-admin-server/src/main/resources/application.properties中指定注册中心地址
#3、构建
mvn clean package -D maven.test.skip=true
#4、启动
mvn --projects dubbo-admin-server spring-boot:run
#或者
cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.1.jar
#5、访问 http://localhost:8080
2.4、入门案例
需求:使用Dubbo构建分布式架构,完成根据用户id查询用户
2.4.1、服务提供者
搭建环境
(1)创建user-provider模块导入依赖
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><!--dubbo的起步依赖--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId><version>2.7.8</version></dependency></dependencies>(2)编写引导类packagecn.itcast.user; importorg.mybatis.spring.annotation.MapperScan; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; "cn.itcast.user.mapper") (publicclassUserProviderApplication { publicstaticvoidmain(String[] args) { SpringApplication.run(UserProviderApplication.class, args); } }
代码实现
(1)UserServiceImpl
packagecn.itcast.user.service; importcn.itcast.user.api.UserService; importcn.itcast.user.domain.User; importcn.itcast.user.mapper.UserMapper; importorg.apache.dubbo.config.annotation.DubboService; importorg.springframework.beans.factory.annotation.Autowired; publicclassUserServiceImplimplementsUserService { privateUserMapperuserMapper; //根据id查询用户名称publicStringqueryUsername(Longid) { returnuserMapper.findById(id).getUsername(); } }
配置文件
server: port: 18081spring: datasource: url: jdbc:mysql://localhost:3306/dubbo-demo?useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driverapplication: name: user-providerlogging: level: cn.itcast: debugpattern: dateformat: HH:mm:ss:SSSdubbo: protocol: name: dubboport: 20881registry: address: nacos://127.0.0.1:8848scan: base-packages: cn.itcast.user.service
2.4.2、服务消费者
搭建环境
(1)创建user-consumer模块导入依赖
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--dubbo的起步依赖--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId><version>2.7.8</version></dependency></dependencies>
(2)配置引导类
packagecn.itcast.user; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootApplication; publicclassUserConsumerApplication { publicstaticvoidmain(String[] args) { SpringApplication.run(UserConsumerApplication.class, args); } }
代码实现
packagecn.itcast.user.controller; importcn.itcast.user.api.UserService; importcn.itcast.user.domain.User; importlombok.extern.slf4j.Slf4j; importorg.apache.dubbo.config.annotation.DubboReference; importorg.springframework.web.bind.annotation.GetMapping; importorg.springframework.web.bind.annotation.PathVariable; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; "/user") (publicclassUserController { //引用远程服务privateUserServiceuserService; "/username/1") (publicStringfindUserName( ("id") Longid) { returnuserService.queryUsername(id); } }
配置文件
server: port: 18080spring: application: name: user-consumerlogging: level: cn.itcast: debugpattern: dateformat: HH:mm:ss:SSSdubbo: registry: address: nacos://127.0.0.1:8848
2.5、代码优化
将接口抽取为独立模块,并且把接口有关的domain都放到这个模块中
(1)创建user-api模块引入依赖
(2)将UserService接口和User对象导入user-api模块下
(3)User对象实现序列化接口
packagecn.itcast.user.domain; importlombok.Data; importjava.io.Serializable; publicclassUserimplementsSerializable { privateLongid; privateStringusername; privateStringaddress; }