1. 程式人生 > >dubbo集成zookeeper rpc遠程調用

dubbo集成zookeeper rpc遠程調用

void res 處理 instance read 成功 目錄 不同 tar

  註:下面使用dubbo依賴的是zookeeper註冊中心,這裏沒有詳細的介紹。在配置之前,請自行準備好zookeeper環境。

    後續如果寫zookeeper的配置會補放鏈接

添加Gradle依賴

    compile group: ‘com.alibaba‘, name: ‘dubbo‘, version: ‘2.5.10‘//dubbo
    compile group: ‘org.apache.zookeeper‘, name: ‘zookeeper‘, version: ‘3.3.3‘//zookeeper
    compile group: ‘com.github.sgroschupf‘, name: ‘zkclient‘, version: ‘0.1‘//
zkclient

服務端provider

目錄結構

技術分享圖片

實體類

技術分享圖片
//這裏實體對象實現了Serializable接口,dubbo規定,在遠程調用實體對象時必須要實現Serializable接口以保證實體對象能夠被序列化,如不實現會報錯
public class Student implements Serializable {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        
this.age = age; } public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this
.age = age; } }
View Code

service方法

技術分享圖片
public interface TestService {

    //返回字符串測試
    String hello(String word);
    //返回實體對象測試,註意實體類要實現 Serializable 接口
    List<Student> selectAllStudent();

}
View Code

實現service方法

技術分享圖片
//給service起個名字 別人調用提供接口方法時就是來實現本實現類的方法,和xml配置文件中所對應,讓spring IOC 註入所管理
@Service("testService")
public class TestServiceImpl implements TestService {
    @Autowired
    private GoodsStoreMapper goodsStoreMapper;

    @Override
    public String hello(String word) {
        return "提供者:"+word;
    }

    @Override
    public List<Student> selectAllStudent() {
        System.out.println("------被調用了------");
        List<Student> list = new ArrayList<Student>();
        list.add(new Student("張三" , 1));
        list.add(new Student("李四" , 2));
        list.add(new Student("王五" , 3));
        return list;
    }


}
View Code

applicationContext.xml

技術分享圖片
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">


    <!-- 提供方應用信息,用於計算依賴關系-->
    <!--name給當前服務起一個名字-->
    <dubbo:application name="springBootProvider"></dubbo:application>
    <!--protocol指定註冊中心類型 這裏用的是zookeeper-->
    <!--address註冊中心地址 ip地址端口號-->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
    <!-- 用dubbo協議在20880端口暴露服務-->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 聲明需要暴露的服務接口-->
    <dubbo:service interface="cn.appsys.service.TestService" ref="testService" />

</beans>
View Code

啟動類

技術分享圖片
@SpringBootApplication
//讀取配置文件
@ImportResource(locations = {"classpath:config/applicationContext.xml"})
public class Start
{
    public static void main(String[] args) {
        SpringApplication.run(Start.class , args);
    }
}
View Code

運行服務端,首先先啟動zookeeper註冊中心

技術分享圖片

啟動啟動類,註意zookeeper的變化

技術分享圖片

  這裏看到 在配置文件中外放的接口已經被註冊進來了,調用方想調用就要通過此節點來調用服務。

客戶端customer

目錄結構

技術分享圖片

  客戶端 實體 方法都和服務端的保持一致

  註意:方法所在的包也要和服務端保持一致,接口名都需要和服務端保持一致

applicationContext.xml配置文件

技術分享圖片
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">


    <dubbo:application name="springBootConsumer"></dubbo:application>
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
    <!--包名 接口名 必須要和服務提供方保持一致-->
    <dubbo:reference id="testService" interface="cn.appsys.service.TestService" ></dubbo:reference>

</beans>
View Code

啟動測試類

技術分享圖片
@SpringBootApplication
//讀取配置文件
@ImportResource(locations = {"classpath:config/applicationContext.xml"})
public class Start
{
    public static void main(String[] args)
    {
        //SpringApplication.run返回一個ApplicationContext對象
        ApplicationContext ac = SpringApplication.run(Start.class , args);
        //通過ApplicationContext對象的getBean獲取實現方法
        TestService testService = ac.getBean(TestService.class);
        //調用方法
        String s = testService.hello("aaaaaaaa");
        System.out.println(s);

        List<Student> stus = testService.selectAllStudent();
        for (Student stu : stus)
        {
            System.out.println(stu.getName());
        }
    }
}
View Code

啟動運行

技術分享圖片

  調用成功,再看一下服務端的變化

技術分享圖片

  成功!

這裏在放上如果不在服務端實體類不實現Serializable接口的報錯信息

技術分享圖片
Exception in thread "main" com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method selectAllStudent in the service cn.appsys.service.TestService. Tried 3 times of the providers [192.168.1.104:20880] (1/1) from the registry 127.0.0.1:2181 on the consumer 192.168.1.104 using the dubbo version 2.0.1. Last error is: Failed to invoke remote method: selectAllStudent, provider: dubbo://192.168.1.104:20880/cn.appsys.service.TestService?anyhost=true&application=springBootConsumer&check=false&dubbo=2.0.1&generic=false&interface=cn.appsys.service.TestService&methods=hello,login,selectAllStudent&pid=8928&register.ip=192.168.1.104&remote.timestamp=1533373429375&side=consumer&timestamp=1533373564236, cause: Failed to send response: Response [id=3, version=2.0.0, status=20, event=false, error=null, result=RpcResult [result=[cn.appsys.entity.Student@45a35c25, cn.appsys.entity.Student@419cd049, cn.appsys.entity.Student@49e561e], exception=null]], cause: java.lang.IllegalStateException: Serialized class cn.appsys.entity.Student must implement java.io.Serializable
java.lang.IllegalStateException: Serialized class cn.appsys.entity.Student must implement java.io.Serializable
View Code

dubbo在遠程調用時註意事項

  1)序列化
    我們所有需要用來傳輸數據的實體一定要實現序列化,不然一定會報錯
  2)業務註入不進來
    例如我們在Controller中註入了一個業務,@Controller使用的是Spring註解,@Reference使用的是Dubbo,如果Spring先進行掃描,那麽業務一定是註入不進去的。如所有我們dubbo也要掃描controller。
  3)超時設置
    根據業務來設定不同的超時配置,如果一個服務很龐大處理的時間相對來說時間會比較長,可以會一直引起超時錯誤。

dubbo集成zookeeper rpc遠程調用