Dubbo提供了三大核心能力:面向接口的远程方法调用(客户端-服务消费者 服务-服务提供者 接口一定要一样),智能容错和负载均衡,以及服务自动注册(服务提供者启动的时候将自己的地址信息写入注册中心-zookeeper)和发现(消费者启动的时候订阅服务提供者-获取服务提供者地址信息)。Dubbo官网地址:https://dubbo.apache.org/zh/
采用的:idea2020版本、maven依赖、jdk1.8版本。
注意:我用的是mybatis-plus实现的。



报错idea报错:

界面报错:

目录
1.注解导包是dubbo的:service层、并且controller层还使用的是@Reference注解
2.配置文件yml:中的内容是否正确格式。配置连接zookeeper是否正确?。导致服务提供者没注册上(当初就没注意一直没注册上QAQ,查看了代码也没错)
?4.2.2.service的实现类:UserServiceImpl类
4.2.3.服务提供者模块的启动类:DubboProviderApplication
5.2.1.controller层:UserController
5.2.2消费者启动类:DubboConsumerApplication
5.2.3.消费者的配置文件:application.yml
最后:打开启动zookeeper服务端->启动服务提供者->启动服务消费者->输入网页地址:http://localhost:520/find/3得到效果。
6.1.超时配置:对于dubbo的调用一般为1秒左右,超时会导致出错。这个一般建议有服务提供者设置:(启动不会报错,访问地址会出错)
create database t_dubbo;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO t_user(username,age) VALUES("张三",18);
INSERT INTO t_user(username,age) VALUES("李四",22);
INSERT INTO t_user(username,age) VALUES("王五",80);
4.0.0
com.demon
dubbo_parent
pom
1.0-SNAPSHOT
dubbo_domain
dubbo_interface
dubbo_provider
dubbo_consumer
org.springframework.boot
spring-boot-starter-parent
2.1.0.RELEASE
5.1.47
1.0.9
1.18.4
3.1.1
com.baomidou
mybatis-plus-boot-starter
${mybatis-plus}
org.projectlombok
lombok
true
${lombok.version}
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
${druid.version}
org.projectlombok
lombok

package com.demon.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_user")
public class User implements Serializable {
private Integer id;
private String username;
private Integer age;
}
dubbo_parent
com.demon
1.0-SNAPSHOT
4.0.0
dubbo_domain
com.baomidou
mybatis-plus
3.1.1

package com.demon.service;
import com.demon.pojo.User;
public interface UserService {
public User findById(Integer id);
}
dubbo_parent
com.demon
1.0-SNAPSHOT
4.0.0
dubbo_interface
com.demon
dubbo_domain
1.0-SNAPSHOT

package com.demon.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demon.pojo.User;
public interface UserDao extends BaseMapper {
}
package com.demon.service.imp;
import com.demon.dao.UserDao;
import com.demon.pojo.User;
import com.demon.service.UserService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public User findById(Integer id) {
System.out.println("调用了provider1,8888端口.......");
return userDao.selectById(id);
}
}
package com.demon;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.demon.dao")
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class,args);
}
}
server:
port: 1314
#数据库来源
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/java_dubbo?useUnicode=true&characterEncoding=utf8
username: root
password: root
dubbo:
application:
name: dubbo-provider
#zookeeper的地址
registry:
address: zookeeper://127.0.0.1:2181
#扫描service
scan:
base-packages: com.demon.service
#超时调用:dubbo调用默认1秒钟超时。
#建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚。
provider:
timeout: 3000
#配置服务提供者的协议和端口
protocol:
name: dubbo
port: 8888
#mybatis-plus的配置
mybatis-plus:
global-config:
db-config:
#跟随数据库主键自增
id-type: auto
dubbo_parent
com.demon
1.0-SNAPSHOT
4.0.0
dubbo_provider
com.demon
dubbo_interface
1.0-SNAPSHOT
com.baomidou
mybatis-plus-boot-starter
org.springframework.boot
spring-boot-starter
mysql
mysql-connector-java
org.apache.dubbo
dubbo-spring-boot-starter
2.7.5
org.apache.curator
curator-recipes
4.2.0
org.apache.zookeeper
zookeeper
3.4.12

package com.demon.cotroller;
import com.demon.pojo.User;
import com.demon.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Reference
private UserService userService;
@GetMapping("/find/{id}")
public User findById(@PathVariable("id") Integer id){
User user = userService.findById(id);
return user;
}
}
package com.demon;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class,args);
}
}
server:
port: 520
dubbo:
application:
name: dubbo_consumer
#zookeeper的地址
registry:
address: zookeeper://127.0.0.1:2181
#启动时检查:不设置需要先启动服务提供者才能启动消费者不然会报错
consumer:
check: false
dubbo_parent
com.demon
1.0-SNAPSHOT
4.0.0
dubbo_consumer
com.demon
dubbo_interface
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.apache.dubbo
dubbo-spring-boot-starter
2.7.5
org.apache.curator
curator-recipes
4.2.0
org.apache.zookeeper
zookeeper
3.4.12
com.alibaba
fastjson
1.2.8
注意:启动服务消费者和服务提供者有启动先后顺序,如果没设置启动时检查为false(这里设置了false)先启动服务消费者会报错。
例如设置服务提供者睡眠1.5秒:

出错访问的页面:
修改服务提供者或者服务消费者yml的配置:
dubbo:
#修改的是服务提供者
provider: #如果是服务消费者为consumer:
timeout: 3000
服务提供方可以配置许多种不同的协议:Dubbo支持的协议有:dubbo、rmi、hessian、http、webservice、rest、redis等。
可以去官方文档查看更多:Dubbo官网地址:https://dubbo.apache.org/zh/

服务提供者的配置文件:
#配置服务提供者的协议和端口
protocol:
name: dubbo
port: 8888
如果想不管服务提供者是否启动都可以先启动服务消费者可以配置下面的。
开发阶段check值设置为false,生产环境改为true。
如果设置为true,启动服务消费者,会抛出异常,表示没有服务提供者
消费者的:yml配置
#启动时检查:不设置需要先启动服务提供者才能启动消费者不然会报错
consumer:
check: false
负载均衡(Load Balance):其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作任务。 在集群负载均衡时,Dubbo 提供了多种均衡策略(包括随机random、轮询roundrobin、最少活跃调用数leastactive),缺省【默认】为random随机调用。
服务消费者yml配置
dubbo:
consumer:
loadbalance: roundrobin
正式生产环境中,服务提供者部署到多台机器上,不需要修改任何代码,只需要部署到不同机器即可测试。
增加一个服务提供者,提供相同的服务;
如果是单机测试,必须通过修该提供者的dubbo协议端口和web服务端口来进行部署。
然后可以通过service接口的实现类里面的输出语句不同。在访问地址查看不同。