Skip to content

Latest commit

 

History

History
164 lines (127 loc) · 5.97 KB

quick.md

File metadata and controls

164 lines (127 loc) · 5.97 KB

快速开始。

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

准备工作

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

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.8.4</version>
</dependency>

坐标引入到本地工程。

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

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>3.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.6</version>
</dependency>
<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
</dependency>

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

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

服务提供方(Provider)

//登录接口
public interface LoginService {
    public LoginResult login(User user);
}

//登录接口实现
public class LoginServiceImpl implements LoginService{

    private LoginCheckService loginCheckService;

    public LoginResult login(User user) {
        LoginResult loginResult;
        try {
            loginCheckService.check(user);
            loginResult = loginSuccess();
        } catch (Exception e) {
            loginResult = loginError();
        }
        return loginResult;
    }

    public void setLoginCheckService(LoginCheckService loginCheckService) {
        this.loginCheckService = loginCheckService;
    }

    private LoginResult loginSuccess() {
        return new LoginResult("0000", "成功啦");
    }

    private LoginResult loginError() {
        return new LoginResult("9999", "错误啦");
    }
}

//登录校验
public interface LoginCheckService {
    public void check(User user);
}

//登录校验实现
public class LoginCheckServiceImpl implements LoginCheckService{
    public void check(User user) {
        argCheck(user);
        passwordCheck(user);
    }

    private void argCheck(User user) {
        checkNotNull(user);
        checkArgument(user.getUsername() != null);
        checkArgument(user.getPassword() != null);
    }

    private void passwordCheck(User user) {
        if (!(Objects.equals("shuwei", user.getUsername()) && Objects.equals("111", user.getPassword())))
            throw new RuntimeException("错误的用户名密码");
    }
}

<!--spring 配置-->
<bean id="loginCheck" class="com.shuvigoss.services.LoginCheckServiceImpl"></bean>

<bean id="login" class="com.shuvigoss.services.LoginServiceImpl">
    <property name="loginCheckService" ref="loginCheck"></property>
</bean>

//调用实现
LoginService loginService = applicationContext.getBean(LoginService.class);
LoginResult loginResultSuccess = loginService.login(new User("shuwei", "111"));
//...其他处理

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

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

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

服务调用方(Consumer)

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

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

<!--spring 注入loginService 看似跟本地调用一样-->
<bean id="ecard" class="com.shuvigoss.services.ECardServiceImpl">
    <property name="loginService" ref="loginService"></property>
</bean>

//本地取卡服务
public class ECardServiceImpl implements ECardService {

    private LoginService loginService;

    public String getCard(String username, String password) {
        //首先登录
        LoginResult loginResult = loginService.login(new User(username, password));
        //登录成功返回卡号"AAAA"
        if (Objects.equals("0000", loginResult.getResponseCode())) {
            return "AAAA";
        }
        //登录失败返回空
        return null;
    }

    public void setLoginService(LoginService loginService) {
        this.loginService = loginService;
    }
}

//调用点
ECardService eCardService = applicationContext.getBean(ECardService.class);
assertEquals("AAAA", eCardService.getCard("shuwei", "111"));

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

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

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

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