快速开始。

10分钟内实现服务注册、订阅。

准备工作

本地安装后,maven install 到本地仓库,dubboxjar包就生成了,使用者可以通过

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>dubbo</artifactId>
  4. <version>2.8.4</version>
  5. </dependency>

坐标引入到本地工程。

接下来引入一些基本jar包(这里选择使用zookeeper做注册中心)

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context</artifactId>
  4. <version>3.2.4.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.zookeeper</groupId>
  8. <artifactId>zookeeper</artifactId>
  9. <version>3.4.6</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.github.sgroschupf</groupId>
  13. <artifactId>zkclient</artifactId>
  14. <version>0.1</version>
  15. </dependency>

提示:如果想使用redis等其他注册中心,请引入相关jar包。

拿登录做个例子,如果在本地有个登录的服务.

服务提供方(Provider)

  1. //登录接口
  2. public interface LoginService {
  3. public LoginResult login(User user);
  4. }
  5. //登录接口实现
  6. public class LoginServiceImpl implements LoginService{
  7. private LoginCheckService loginCheckService;
  8. public LoginResult login(User user) {
  9. LoginResult loginResult;
  10. try {
  11. loginCheckService.check(user);
  12. loginResult = loginSuccess();
  13. } catch (Exception e) {
  14. loginResult = loginError();
  15. }
  16. return loginResult;
  17. }
  18. public void setLoginCheckService(LoginCheckService loginCheckService) {
  19. this.loginCheckService = loginCheckService;
  20. }
  21. private LoginResult loginSuccess() {
  22. return new LoginResult("0000", "成功啦");
  23. }
  24. private LoginResult loginError() {
  25. return new LoginResult("9999", "错误啦");
  26. }
  27. }
  28. //登录校验
  29. public interface LoginCheckService {
  30. public void check(User user);
  31. }
  32. //登录校验实现
  33. public class LoginCheckServiceImpl implements LoginCheckService{
  34. public void check(User user) {
  35. argCheck(user);
  36. passwordCheck(user);
  37. }
  38. private void argCheck(User user) {
  39. checkNotNull(user);
  40. checkArgument(user.getUsername() != null);
  41. checkArgument(user.getPassword() != null);
  42. }
  43. private void passwordCheck(User user) {
  44. if (!(Objects.equals("shuwei", user.getUsername()) && Objects.equals("111", user.getPassword())))
  45. throw new RuntimeException("错误的用户名密码");
  46. }
  47. }
  48. <!--spring 配置-->
  49. <bean id="loginCheck" class="com.shuvigoss.services.LoginCheckServiceImpl"></bean>
  50. <bean id="login" class="com.shuvigoss.services.LoginServiceImpl">
  51. <property name="loginCheckService" ref="loginCheck"></property>
  52. </bean>
  53. //调用实现
  54. LoginService loginService = applicationContext.getBean(LoginService.class);
  55. LoginResult loginResultSuccess = loginService.login(new User("shuwei", "111"));
  56. //...其他处理

如果要把LoginService的login方法提供给别的业务系统调用,通过dubbox只需要这么做就好了。

  1. <dubbo:application name="testProvider" owner="shuvigoss" organization="ecs"/>
  2. <dubbo:protocol name="dubbo" port="20880" />
  3. <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
  4. <dubbo:service interface="com.shuvigoss.services.LoginService" ref="login"/>

只需在spring中使用<dubbo:service interface="com.shuvigoss.services.LoginService" ref="login"/>暴露出来,dubbox会在zookeeper中将服务注册。

服务调用方(Consumer)

  1. <dubbo:application name="testConsumer" owner="shuvigoss" organization="ecs"/>
  2. <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
  3. <dubbo:reference id="loginService" interface="com.shuvigoss.services.LoginService"/>

通过dubbo:reference从zookeeper处拿到com.shuvigoss.services.LoginService服务的服务器列表。

  1. <!--spring 注入loginService 看似跟本地调用一样-->
  2. <bean id="ecard" class="com.shuvigoss.services.ECardServiceImpl">
  3. <property name="loginService" ref="loginService"></property>
  4. </bean>
  5. //本地取卡服务
  6. public class ECardServiceImpl implements ECardService {
  7. private LoginService loginService;
  8. public String getCard(String username, String password) {
  9. //首先登录
  10. LoginResult loginResult = loginService.login(new User(username, password));
  11. //登录成功返回卡号"AAAA"
  12. if (Objects.equals("0000", loginResult.getResponseCode())) {
  13. return "AAAA";
  14. }
  15. //登录失败返回空
  16. return null;
  17. }
  18. public void setLoginService(LoginService loginService) {
  19. this.loginService = loginService;
  20. }
  21. }
  22. //调用点
  23. ECardService eCardService = applicationContext.getBean(ECardService.class);
  24. assertEquals("AAAA", eCardService.getCard("shuwei", "111"));

代码很简单,通过简单的spring配置,完成了服务的注册、订阅、调用的工作。

  1. 这儿有个问题,Consumer在调用LoginService时,需要传入User类做参数,
  2. 并且返回值是LoginResult这个对象,Consumer本地并没有UserLoginResultLoginService对象。

我认为有3种方式去实现。

  1. 使用String json方式进行交互。
  2. 将各业务平台API进行梳理,API无需过多的说明,直接把interface、javabean放到服务器上,谁需要调用谁就将所需文件集成到本地。(适合其他不是很熟悉的业务平台)
  3. 内部的业务平台所有interface、javabean以jar包方式打到maven 仓库中,需要的业务平台在自己的pom中加入依赖(推荐)。