【Dubbo】使用配置類發佈服務、消費服務

 

概述

  本文使用Dubbo提供的ServiceConfig、ReferenceConfig配置類演示怎樣提供服務、消費服務、註冊服務、調用服務等

 

一、接口及公共類

1. GreetingService

public interface GreetingService {

    String sayHello(String name);

    Result<String> testGeneric(PoJo poJo);
}

 

2. GreetingService

public class PoJo {
    private String id;
    private String name;
}

 

3. Result

public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;
    
    private boolean sucess;
    private String msg;
    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public boolean isSucess() {
        return sucess;
    }

    public void setSucess(boolean sucess) {
        this.sucess = sucess;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
 

二、服務提供者

1. GreetingServiceImpl

public class GreetingServiceImpl implements GreetingService {

    @Override
    public String sayHello(String name) {

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Hello " + name + " " + RpcContext.getContext().getAttachment("company");
    }

    @Override
    public Result<String> testGeneric(PoJo poJo) {

        Result<String> result = new Result<>();
        result.setSucess(true);
        try {
            result.setData(JSON.json(poJo));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }
}
 

2. ApiProvider

public class ApiProvider {

    public static void main(String[] args) throws IOException {

        // 1.創建ServiceConfig實例
        ServiceConfig<GreetingService> serviceConfig = new ServiceConfig<GreetingService>();

        // 2.設置應用程序配置
        serviceConfig.setApplication(new ApplicationConfig("dubbo-provider"));

        // 3.設置服務註冊中心信息
        RegistryConfig registryConfig = new RegistryConfig("zookeeper://127.0.0.1:2181");
        serviceConfig.setRegistry(registryConfig);

        // 4.設置接口與實現類
        serviceConfig.setInterface(GreetingService.class);
        serviceConfig.setRef(new GreetingServiceImpl());

        // 5.設置服務分組與版本
        // 在Dubbo中,"服務接口+服務分組+服務版本"唯一地確定一個服務,同一個服務接口可以有不同的版本以便服務升級等,
        // 另外每個服務接口可以屬於不同分組,所以當調用方消費服務時一定要設置正確的分組與版本
        serviceConfig.setVersion("1.0.0");
        serviceConfig.setGroup("dubbo");

        // 6.設置線程池策略
        //HashMap<String, String> parameters = new HashMap<>();
        //parameters.put("threadpool", "mythreadpool");
        //serviceConfig.setParameters(parameters);

        // 7.導出服務
        serviceConfig.export();

        // 8.掛起線程,避免服務停止
        System.out.println("server is started");
        System.in.read();
    }
}
 

三、服務消費者

1. ApiConsumer

public class ApiConsumer {

    public static void main(String[] args) throws InterruptedException {

        // 1.創建服務引用對象實例
        ReferenceConfig<GreetingService> referenceConfig = new ReferenceConfig<GreetingService>();
        // 2.設置應用程序信息
        referenceConfig.setApplication(new ApplicationConfig("first-dubbo-consumer"));
        // 3.設置服務註冊中心
        referenceConfig.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));

        //直連測試
        //referenceConfig.setUrl("dubbo://192.168.0.109:20880");

        // 4.設置服務接口和超時時間
        referenceConfig.setInterface(GreetingService.class);
        referenceConfig.setTimeout(5000);

        // 5.設置自定義負載均衡策略與集羣容錯策略
        referenceConfig.setLoadbalance("myroundrobin");
        referenceConfig.setCluster("myCluster");
        RpcContext.getContext().set("ip", "30.10.67.231");

        // 6.設置服務分組與版本
        referenceConfig.setVersion("1.0.0");
        referenceConfig.setGroup("dubbo");

        // 7.引用服務
        GreetingService greetingService = referenceConfig.get();

        // 8. 設置隱式參數
        // 設置隱式參數,然後服務提供者就可以在服務實現類方法裏獲取參數值
        RpcContext.getContext().setAttachment("company", "alibaba");

        // 9. 調用服務
        // 同步發起遠程調用,然後當前線程會被阻塞直到服務提供方把結果返回
        System.out.println(greetingService.sayHello("world"));

        Thread.currentThread().join();
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章