Apache Dubbo 是高性能、透明化的 RPC 分布式服務框架。本文通過一個 Maven 多模塊項目,演示基於 Zookeeper 註冊中心的服務提供者發布、消費者引用、Spring MVC 整合、負載均衡與容錯配置全流程。
zoo.cfg,客戶端端口 2181。啟動 zkServer.sh start。dubbo.properties 指向 ZK 地址,提供可視化治理控制台。dubbo-demo (父工程) ├── dubbo-demo-common // 公共模型、工具、基類 ├── dubbo-demo-api // 服務接口定義 (IUserService) ├── dubbo-demo-service // 服務實現提供者 └── dubbo-demo-web // 消費者 Web 應用
public interface IUserService {
List<User> queryAll(Map<String, Object> param) throws Exception;
void saveUser(Map<String, Object> param) throws Exception;
void deleteUser(Map<String, Object> param) throws Exception;
}
@Service(interfaceClass = IUserService.class) // Dubbo 註解發布
public class UserServiceImpl implements IUserService {
@Autowired private IUserDao userDao; // Spring 注入 DAO
@Override public List<User> queryAll(Map<String, Object> param) { return userDao.queryAll(param); }
@Override public void saveUser(Map<String, Object> param) { userDao.saveUser(param); }
@Override public void deleteUser(Map<String, Object> param) { userDao.deleteUser(param); }
}
<beans xmlns:dubbo="https://code.alibabatech.com/schema/dubbo">
<dubbo:application name="dubbo-demo-service" />
<dubbo:registry protocol="zookeeper" address="10.0.10.51:2181" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:annotation package="org.dubbo.demo.service" /> <!-- 掃描 @Service -->
</beans>
public class StartDubboService {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring.xml");
context.start();
synchronized (StartDubboService.class) { while (true) { StartDubboService.class.wait(); } }
}
}
@Controller @RequestMapping("/user")
public class UserController extends BaseController {
@Reference private IUserService userService; // Dubbo 註解引用
@RequestMapping("/getUserList")
@ResponseBody
public String getUserList(int pageNo, int pageSize) {
Map<String, Object> param = new HashMap<>();
param.put("pageNo", pageNo); param.put("pageSize", pageSize);
List<User> userList = userService.queryAll(param);
return new Gson().toJson(mapOf("userList", userList));
}
// ... deleteUser, saveUserTest
}
<beans xmlns:dubbo="https://code.alibabatech.com/schema/dubbo">
<dubbo:application name="dubbo-demo-web" />
<dubbo:registry address="zookeeper://10.0.10.51:2181" check="false" />
<dubbo:reference interface="org.dubbo.demo.api.service.IUserService" id="userService" />
</beans>
在 <dubbo:reference> 或 <dubbo:service> 上配置:
| 屬性 | 可選值 | 說明 |
|---|---|---|
| loadbalance | random(默認)、roundrobin、leastactive、consistenthash | 隨機、輪詢、最少活躍調用、一致性哈希 |
| cluster | failover(默認)、failfast、failsafe、failback、forking、broadcast | 失敗自動切換、快速失敗、失敗安全、失敗重試、並行調用、廣播調用 |
| retries | int (默認 2) | 重試次數(不含首次) |
| timeout | int (毫秒,默認 1000) | 調用超時時間 |
| actives | int | 每服務提供者最大並發調用數,防止過載 |
<dubbo:reference interface="..." id="userService" loadbalance="leastactive" cluster="failover" retries="2" timeout="3000" />
https://localhost:8080/dubbo-demo-web/user/getUserList.do?pageNo=0&pageSize=5,返回 JSON 數據。https://github.com/peterchenhdu/Demos/tree/master/dubbo-demo
zoo.cfg 集群參數。version="1.0.0"),平滑升級。mock="return null")、熔斷 (Sentinel/Hystrix 整合)。