Dubbo的学习总结(一)——远程调用

在学习用dubbo进行分布式远程调用之前,先来看一个简单的有关访问网络上的天气预报接口的远程调用实例。

1.先创建一个java项目,创建过程这里不详细讲述,只附上一张截图供入门级选手参考:


2.创建好一个java项目后,接下来就是创建一个Weather实体类(这里可以使用lombok的@Data注解,就可以不用自己手写get和set还有toString 这些代码了):

public class Weather {

    //城市
    private String city;

    //温度
    private String temp;

    //湿度
    private String sd;

    //天气概述
    private String desc;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getTemp() {
        return temp;
    }

    public void setTemp(String temp) {
        this.temp = temp;
    }

    public String getSd() {
        return sd;
    }

    public void setSd(String sd) {
        this.sd = sd;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "天气信息{" +
                "城市='" + city + '\'' +
                ", 温度='" + temp + '\'' +
                ", 湿度='" + sd + '\'' +
                ", 天气描述='" + desc + '\'' +
                '}';
    }
}

3.接下来就是WeatherService和实现类的创建,哦,对了,远程调用天气预报接口的代码部分因为是可以提取出来的,只需要在WeatherServiceImpl中写业务代码就好了,所以我使用了动态代理(很简单的,别怕哈),接下来就是代码了。

WeatherService:

public interface WeatherService {
    /**
     * 查询天气
     * @param cityCode
     * @return
     */
    Weather queryWeather(String cityCode);
}

WeatherServiceProxy(这个是动态代理的代码):

public class WeatherServiceProxy implements InvocationHandler {

    //目标对象
    private Object target = null;

    /**
     * 定义获取代理对象
     * @param target
     * @return
     */
    public Object getProxy(Object target){
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //获取城市代码
        String cityCode = (String) args[0];
        Weather wea = new Weather();
        //远程调用的地址
        String remote_url = "http://www.weather.com.cn/data/sk/"+cityCode+".html";
        try{
            //使用URL表示地址
            URL url = new URL(remote_url);
            //获取url的连接对象
            URLConnection urlconn = url.openConnection();
            //转为HttpURLConnection
            HttpURLConnection http_conn = (HttpURLConnection) urlconn;
            //设置请求的方式
            http_conn.setRequestMethod("GET");
            //连接远程地址
            http_conn.connect();
            //判断连接的结果
            if (http_conn.getResponseCode() == HttpURLConnection.HTTP_OK){
                InputStream in = http_conn.getInputStream();
                BufferedReader bin = new BufferedReader(new InputStreamReader(in));
                String line = bin.readLine();
                if (line != null){
                    Object[] newargs = new Object[]{line};
                    //调用目标方法
                    wea = (Weather) method.invoke(target,newargs);
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }

        return wea;
    }

WeatherServiceImpl(对了,在这部分代码中用到了jackson,就是用来通过序列化和反序列化操控json串的,用到的jar包有jackson-annotations-2.0.0.jar、jackson-core-2.0.0.jar和jackson-databind-2.0.0.jar。这些jar包网上是可以找到的,所以在这不给链接了,你要的话,我也不给,就是不给):

public class WeatherServiceImpl implements WeatherService {

    /**
     * 查询天气
     * @param info
     * @return
     */
    @Override
    public Weather queryWeather(String info) {
        Weather weather = new Weather();
        try{
            if (info != null){
                ObjectMapper objectMapper = new ObjectMapper();
                //反序列化操作
                Map map = objectMapper.readValue(info,Map.class);
                Map<String,String> weamap = (Map<String, String>) map.get("weatherinfo");
                weather.setCity(weamap.get("city"));
                weather.setTemp(weamap.get("temp"));
                weather.setSd(weamap.get("SD"));
                weather.setDesc("0".equals(weamap.get("rain"))?"晴":"有雨");
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        return weather;
    }

4.最后就是测试的代码了,在这附上查询天气的接口(http://www.weather.com.cn):

public class WeatherTest {
    public static void main(String[] args){
        //获取目标对象
        WeatherService weatherService = new WeatherServiceImpl();
        //获取代理对象
        WeatherServiceProxy weatherServiceProxy = new WeatherServiceProxy();
        WeatherService weatherService1 = (WeatherService) weatherServiceProxy.getProxy(weatherService);
        Weather weather = weatherService1.queryWeather("101110101");
        System.out.println("天气预报:" + weather.toString());
    }
}

这篇博客讲解的东西很少,只是一个简单的远程调用的例子,这个是我学习dubbo前的小甜点,就是告诉大家远程调用的简单代码怎么写,至于什么是远程调用(RPC)?,这个。。。不告诉你。


猜你喜欢

转载自blog.csdn.net/lixiangxiang666/article/details/79775633