精华内容
下载资源
问答
  • Dubbo 实现远程调用

    2015-06-24 18:52:34
    1、Dubbo 远程调用实现 2、内带zookeeper-3.4.5消息服务 3、直接导入myeclipse运行:dubbo-server导入tomcat中运行 4、dubbo-client 运行测试类/dubbo-client/src/com/fengjx/main/Consumer.java
  • Remote Procedure Call:远程过程调用 1.2 Dubbo架构 Subscribe 订阅;签署;赞成 Monitor 监听器;监控器 1.3 Dubbo在Zookeeper中注册信息的结构 2. Dubbo使用 2.1 创建Common工程 group id:com.joker.dubbo ...

    1. Dubbo介绍

    示例代码:Github

    1.1 RPC

    Remote Procedure Call:远程过程调用

    在这里插入图片描述

    1.2 Dubbo架构

    在这里插入图片描述

    Subscribe 订阅;签署;赞成

    Monitor 监听器;监控器

    1.3 Dubbo在Zookeeper中注册信息的结构

    在这里插入图片描述

    2. Dubbo使用

    2.1 创建Common工程

    group id:com.joker.dubbo

    artifact id:dubbo-common

    package:jar

    创建实体类

    com.joker.dubbo.entity.Employee.java

    package com.joker.dubbo.entity;
    
    import java.io.Serializable;
    
    public class Employee implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private Integer empId;
        private String empName;
        private Double salary;
    
        public Employee() {
        }
    
        public Employee(Integer empId, String empName, Double salary) {
            this.empId = empId;
            this.empName = empName;
            this.salary = salary;
        }
        // getter、setter略
    }
    

    创建远程调用的接口

    package com.joker.dubbo.service.EmployeeRemoteService.java

    package com.joker.dubbo.service;
    
    import com.joker.dubbo.entity.Employee;
    import java.util.List;
    
    public interface EmployeeRemoteService {
        List<Employee> getEmployeeByConditionRemote(Employee employee);
    }
    

    2.2 创建Provider工程

    group id:com.joker.dubbo

    artifact id:dubbo-provider

    package:war

    依赖于:Common工程,使用其中的实体类和接口

    依赖信息

    pom.xml

    <dependencies>
        <!-- 依赖于dubbo-common -->
        <dependency>
            <groupId>com.joker.dubbo</groupId>
            <artifactId>dubbo-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.5</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>
    

    配置log4j日志文件

    log4j.properties

    log4j.rootLogger=DEBUG,myConsole
    log4j.appender.myConsole=org.apache.log4j.ConsoleAppender
    log4j.appender.myConsole.Target=System.out
    log4j.appender.myConsole.layout=org.apache.log4j.PatternLayout
    log4j.appender.myConsole.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    

    配置web.xml

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
             version="3.0">
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-dubbo.xml</param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        
    </web-app>
    

    Spring配置文件中Dubbo的配置

    spring-dubbo.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配置:指定当前Web应用名称,便于在注册中心中注册 -->
        <dubbo:application name="dubbo-provider"/>
    
        <!-- Dubbo配置:指定注册中心的种类以及位置 -->
        <dubbo:registry protocol="zookeeper" address="192.168.252.128" port="2181"/>
    
        <!-- Dubbo配置:指定Dubbo的Provider本身监听的端口号 consumer访问时要使用这个端口号-->
        <dubbo:protocol name="dubbo" port="20880"/>
    
        <!-- 配置接口实现类的bean -->
        <bean id="employeeRemoteServiceImpl" class="com.joker.dubbo.service.impl.EmployeeRemoteServiceImpl"/>
    
        <!-- Dubbo配置:给远程方法接口指定实现类 -->
        <dubbo:service interface="com.joker.dubbo.service.EmployeeRemoteService" ref="employeeRemoteServiceImpl"/>
    
    </beans>
    

    创建远程调用接口的实现类

    com.joker.dubbo.service.impl.EmployeeRemoteServiceImpl.java

    package com.joker.dubbo.service.impl;
    
    import com.joker.dubbo.entity.Employee;
    import com.joker.dubbo.service.EmployeeRemoteService;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @PackageName:com.joker.dubbo.service.impl
     * @Date:2019/10/18 14:02
     * @Author: zsy
     */
    public class EmployeeRemoteServiceImpl implements EmployeeRemoteService {
        @Override
        public List<Employee> getEmployeeByConditionRemote(Employee employee) {
            System.out.println("***provider***:" + employee);
    
            // 假数据用于数据测试
            List<Employee> empList = new ArrayList<>();
            empList.add(new Employee(111, "empName111", 111.11));
            empList.add(new Employee(222, "empName222", 222.22));
            empList.add(new Employee(333, "empName333", 333.33));
            return empList;
        }
    }
    

    注册简单测试

    运行web项目,启动tomcat服务器,尝试连接Zookeeper,此时要确保服务器Zookeeper已启动

    启动成功可以看到控制台日志打印心跳检查信息:

    [2019-10-18 02:19:51,355] Artifact dubbo-provider:war exploded: Artifact is deployed successfully
    [2019-10-18 02:19:51,355] Artifact dubbo-provider:war exploded: Deploy took 24,538 milliseconds
    [DEBUG] 2019-10-18 14:20:01,235(31554) --> [RMI TCP Connection(192.168.252.128:2181)] org.apache.zookeeper.ClientCnxn$SendThread.readResponse(ClientCnxn.java:758): Got ping response for sessionid: 0x16ddd844d9a0000 after 2ms  
    [DEBUG] 2019-10-18 14:20:11,241(41560) --> [RMI TCP Connection(192.168.252.128:2181)] org.apache.zookeeper.ClientCnxn$SendThread.readResponse(ClientCnxn.java:758): Got ping response for sessionid: 0x16ddd844d9a0000 after 2ms  
    

    此时到服务器端启动Zookeeper客户端:

    /opt/zookeeper3.4.9/bin/zkCli.sh
    
    #启动后查看是否已经注册上provider的信息
    [zk: localhost:2181(CONNECTED) 0] ls /
    [animal, dubbo, zookeeper, fruits]
    [zk: localhost:2181(CONNECTED) 1] ls /dubbo
    [com.joker.dubbo.service.EmployeeRemoteService]
    [zk: localhost:2181(CONNECTED) 2] ls /dubbo/com.joker.dubbo.service.EmployeeRemoteService
    [configurators, providers]
    [zk: localhost:2181(CONNECTED) 3] ls /dubbo/com.joker.dubbo.service.EmployeeRemoteService/providers
    [dubbo%3A%2F%2F192.168.252.1%3A20880%2Fcom.joker.dubbo.service.EmployeeRemoteService%3Fanyhost%3Dtrue%26application%3Ddubbo-provider%26dubbo%3D2.5.5%26generic%3Dfalse%26interface%3Dcom.joker.dubbo.service.EmployeeRemoteService%26methods%3DgetEmployeeByConditionRemote%26pid%3D6364%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1571379571726]
    [zk: localhost:2181(CONNECTED) 4] 
    

    通过ls /dubbo/com.joker.dubbo.service.EmployeeRemoteService/providers我们看到下面注册的provider,通过Url解码得到内容:

    dubbo://192.168.252.1:20880/com.joker.dubbo.service.EmployeeRemoteService?anyhost=true&application=dubbo-provider&dubbo=2.5.5&generic=false&interface=com.joker.dubbo.service.EmployeeRemoteService&methods=getEmployeeByConditionRemote&pid=6364&revision=1.0-SNAPSHOT&side=provider&timestamp=1571379571726
    

    至此,证明Provider配置成功!

    2.3 创建Consumer工程

    group id:com.joker.dubbo

    artifact id:dubbo-consumer

    package:war

    依赖信息

    pom.xml

    <dependencies>
        <!-- 依赖于dubbo-common -->
        <dependency>
            <groupId>com.joker.dubbo</groupId>
            <artifactId>dubbo-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.5</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- spring-mvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.10.RELEASE</version>
        </dependency>
        <!-- jsp -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1.3-b06</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    

    配置log4j日志配置文件

    log4j.properties

    log4j.rootLogger=DEBUG,myConsole
    log4j.appender.myConsole=org.apache.log4j.ConsoleAppender
    log4j.appender.myConsole.Target=System.out
    log4j.appender.myConsole.layout=org.apache.log4j.PatternLayout
    log4j.appender.myConsole.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    

    配置web.xml

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
             version="3.0">
    
        <servlet>
            <servlet-name>springDispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>springDispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    配置SpringMVC

    spring-mvc.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"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- SpringMVC相关配置 -->
        <context:component-scan base-package="com.joker.dubbo.handler"/>
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <mvc:annotation-driven/>
        <mvc:default-servlet-handler/>
    
        <!-- Dubbo配置:当前应用名称 -->
        <dubbo:application name="dubbo-consumer"/>
    
        <!-- Dubbo配置:指定Dubbo注册中心类型和位置 -->
        <dubbo:registry protocol="zookeeper" address="192.168.252.128" port="2181"/>
    
        <!-- Dubbo配置:引用Provider提供的可以远程调用的服务 -->
        <dubbo:reference id="employeeRemoteService" interface="com.joker.dubbo.service.EmployeeRemoteService"/>
    
    </beans>
    

    创建Handler类映射远程接口请求

    com.joker.dubbo.handler.EmployeeHandler.java

    package com.joker.dubbo.handler;
    
    import com.joker.dubbo.entity.Employee;
    import com.joker.dubbo.service.EmployeeRemoteService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import java.util.List;
    
    /**
     * @PackageName:com.joker.dubbo.handler
     * @Date:2019/10/18 14:51
     * @Author: zsy
     */
    @Controller
    public class EmployeeHandler {
    
        @Autowired
        EmployeeRemoteService employeeRemoteService;
    
        @RequestMapping("/get/emp/list")
        public String getEmpList() {
            Employee employee = new Employee(666, "empName666", 666.66);
            List<Employee> empList = employeeRemoteService.getEmployeeByConditionRemote(employee);
            for (Employee emp : empList) {
                System.out.println(emp);
            }
            return "success";
        }
    }
    

    创建返回成功页面

    success.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    	<h1> Success !</h1>
    </body>
    </html>
    

    注册简单测试

    运行consumer的web项目,启动一个新的tomcat服务器,并设置不同的端口号;

    同provider,启动完成后可以看到控制台日志打印心跳检查信息:

    [DEBUG] 2019-10-18 16:21:14,947(31499) --> [RMI TCP Connection(192.168.252.128:2181)] org.apache.zookeeper.ClientCnxn$SendThread.readResponse(ClientCnxn.java:758): Got ping response for sessionid: 0x16ddd844d9a000b after 3ms  
    [DEBUG] 2019-10-18 16:21:24,947(41499) --> [RMI TCP Connection(192.168.252.128:2181)] org.apache.zookeeper.ClientCnxn$SendThread.readResponse(ClientCnxn.java:758): Got ping response for sessionid: 0x16ddd844d9a000b after 1ms  
    [DEBUG] 2019-10-18 16:21:34,949(51501) --> [RMI TCP Connection(192.168.252.128:2181)] org.apache.zookeeper.ClientCnxn$SendThread.readResponse(ClientCnxn.java:758): Got ping response for sessionid: 0x16ddd844d9a000b after 1ms  
    

    此时到Zookeeper服务端查看服务注册信息:

    [zk: localhost:2181(CONNECTED) 21] ls /dubbo/com.joker.dubbo.service.EmployeeRemoteService
    [consumers, configurators, routers, providers]
    [zk: localhost:2181(CONNECTED) 22]
    

    这是可以看到Zookeeper注册中心不仅有providers,还有了新注册的consumers;

    这时执行命令:ls /dubbo/com.joker.dubbo.service.EmployeeRemoteService/consumers

    可以看到我们注册的consumer信息

    [consumer%3A%2F%2F192.168.252.1%2Fcom.joker.dubbo.service.EmployeeRemoteService%3Fapplication%3Ddubbo-consumer%26category%3Dconsumers%26check%3Dfalse%26dubbo%3D2.5.5%26interface%3Dcom.joker.dubbo.service.EmployeeRemoteService%26methods%3DgetEmployeeByConditionRemote%26pid%3D13468%26revision%3D1.0-SNAPSHOT%26side%3Dconsumer%26timestamp%3D1571386846115]
    

    通过URL解码可以看到:

    consumer://192.168.252.1/com.joker.dubbo.service.EmployeeRemoteService?application=dubbo-consumer&category=consumers&check=false&dubbo=2.5.5&interface=com.joker.dubbo.service.EmployeeRemoteService&methods=getEmployeeByConditionRemote&pid=13468&revision=1.0-SNAPSHOT&side=consumer&timestamp=1571386846115
    

    这里显示的是调用接口的消费者信息。


    这时打开浏览器输出http://localhost:8081/consumer/get/emp/list

    注意:本项目中配置consumer的tomcat端口号为8081

    可以看到成功页面返回!

    同时看到tomcat运行控制台打印信息:

    consumer端:

    Employee{empId=111, empName='empName111', salary=111.11}
    Employee{empId=222, empName='empName222', salary=222.22}
    Employee{empId=333, empName='empName333', salary=333.33}
    

    provider端

    ***provider***:Employee{empId=666, empName='empName666', salary=666.66}
    

    证明远程方法调用成功,consumer调用了远程方法,并传递给provider一个Employee对象。

    provider成功接收,并执行getEmployeeByConditionRemote()方法,返回一个Employee的List。

    至此,consumer配置成功!

    Dubbo+Zookeeper实现远程调用成功!

    返回!

    同时看到tomcat运行控制台打印信息:

    consumer端:

    Employee{empId=111, empName='empName111', salary=111.11}
    Employee{empId=222, empName='empName222', salary=222.22}
    Employee{empId=333, empName='empName333', salary=333.33}
    

    provider端

    ***provider***:Employee{empId=666, empName='empName666', salary=666.66}
    

    证明远程方法调用成功,consumer调用了远程方法,并传递给provider一个Employee对象。

    provider成功接收,并执行getEmployeeByConditionRemote()方法,返回一个Employee的List。

    至此,consumer配置成功!

    Dubbo+Zookeeper实现远程调用成功!

    展开全文
  • 编写远程接口实现类并继承java.rmi.server.UnicastRemoteObject 类 编写远程启动类,实现指定注册服务端口并注册实例到rmi注册服务器上 二、客户端 编写本地接口继承java.rmi.Remote 接口,与远程服务端接口保持...

    Java RMI(Remote Method Invocation) 是jdk1.2 引入的一套Java自带 RPC实现方案。

    实现过程如下:

    一、远程服务端

    1. 编写远程接口继承java.rmi.Remote 接口
    2. 编写远程接口实现类并继承java.rmi.server.UnicastRemoteObject 类
    3. 编写远程启动类,实现指定注册服务端口并注册实例到rmi注册服务器上

    二、客户端

    1. 编写本地接口继承java.rmi.Remote 接口,与远程服务端接口保持包名参数等一致。
    2. 使用Naming.lookup 返回与指定名称关联的远程对象的引用
    3. 使用引用对象进行调用远程方法

    三、代码实现

    3.1 远程接口 service.HelloService.java

    该接口需要继承java.rmi.Remote 接口

    package service;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    public interface HelloService extends Remote {
        public String sayHello(String name)  throws RemoteException;
    }

     3.2 远程接口实现service.impl.HelloServiceImpl

    该实现类需要实现远程接口以及继承java.rmi.server.UnicastRemoteObject 类,实现序列化。

    package service.impl;
    
    import service.HelloService;
    
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    
    /**
     * @author huizi
     */
    public class HelloServiceImpl  extends UnicastRemoteObject implements HelloService {
    
        public HelloServiceImpl() throws RemoteException {
        }
    
        public String sayHello(String name)throws RemoteException {
            System.out.println("这是远程方法执行逻辑.........");
            return name+"执行了远程方法 SayHello";
        }
    }
    

    3.3 远程启动类(重点)

    在该类中需要指定注册服务器的端口,以及将需要进行注册的实例进行注册操作。

    package app;
    
    import service.HelloService;
    import service.impl.HelloServiceImpl;
    
    import java.net.MalformedURLException;
    import java.rmi.AlreadyBoundException;
    import java.rmi.Naming;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    
    public class ServiceMain {
    
        public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
    
            //1 启动RMI注册服务,指定端口号
            LocateRegistry.createRegistry(9999);
            //2,创建要被访问的远程对象实例
            HelloService service = new HelloServiceImpl();
    
            //3,把远程对象实例注册到RMI注册服务器上
            Naming.bind("rmi://127.0.0.1:9999/HelloService",service);
    
            System.out.println("服务端启动运行中....");
    
        }
    }
    

    3.4 客户端接口 

    package service;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    public interface HelloService extends Remote {
        public String sayHello(String name)  throws RemoteException;
    }
    

    3.5 客户端调用类

    在该类中使用Naming.lookup("rmi://127.0.0.1:9999/HelloService") 获取远程对象引用,并使用客户端接口类进行远程调用。

    package app;
    
    import service.HelloService;
    
    import java.net.MalformedURLException;
    import java.rmi.Naming;
    import java.rmi.NotBoundException;
    import java.rmi.RemoteException;
    
    public class ClientMain {
    
        public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
            HelloService helloService = (HelloService) Naming.lookup("rmi://127.0.0.1:9999/HelloService");
            String resultStr = helloService.sayHello("PC客户端 ");
            System.out.println(resultStr);
        }
    }
    

    四、启动运行 先启动远程短,在启动客户端调用,打印如下:

     

     

    展开全文
  • DubboDubbo框架介绍dubbo入门案例dubbo负载均衡的实现补充 Dubbo框架介绍 http://dubbo.apache.org/zh-cn/ Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司...Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大...

    Dubbo框架介绍

    http://dubbo.apache.org/zh-cn/
    Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
    Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
    在这里插入图片描述

    初级的微服务项目有3大部分:
    1.consumer
    2.provider
    3.中立API接口
    provider依赖中立API接口

    dubbo入门案例

    dubbo入门案例 资料提取码:2yvy

    1. 构建项目
      下载并导入dubbo入门案例
      在这里插入图片描述
    2. 在父项目导入dubbo的jar包文件
    	  <!--引入dubbo配置 -->
          <dependency>
             <groupId>com.alibaba.boot</groupId>
             <artifactId>dubbo-spring-boot-starter</artifactId>
             <version>0.2.0</version>
          </dependency>  
    
    1. provider都依赖于中立API接口,在provider 里都添加中立API接口的依赖
    <dependencies>
      <dependency>
          <groupId>com.jt.dubbo</groupId>
          <artifactId>dubbo-jt-demo-interface</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      </dependency>
     </dependencies>
    
    1. 编辑provider项目的后台调用的方法
    //这个Service注解是dubbo的,而这个UserService接口是另一个中立API接口项目的
    //dubbo的@Service注解表示这个服是务提供者的
    
    @Service(timeout=3000)	//3秒超时  dubbo内部封装了RPC 
    public class UserServiceImpl implements UserService {
    	
    	@Autowired
    	private UserMapper userMapper;
    	
    	//查询所有数据
    	@Override
    	public List<User> findAll() {
    		
    		System.out.println("我是第一个服务的提供者");
    		return userMapper.selectList(null);
    	}
    	
    	@Override
    	public void saveUser(User user) {
    		
    		userMapper.insert(user);
    	}
    
    }
    
    
    1. 编辑provider项目的配置文件
    server:
      port: 9000
    
    spring:
      datasource:
        #引入druid数据源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
        username: root
        password: root
    
    #springBoot导入dubboo   
    dubbo:
      scan:      #让dubbo注解起作用  @Service
        basePackages: com.jt
      application:
        name: provider-user   #定义提供者的名称    不同的服务名称不同
      registry:				#zk的ip地址要换成自己的
        address: zookeeper://192.168.64.128:2181?backup=192.168.64.128:2182,192.168.64.128:2183
      protocol:    #rpc  指定协议规则
        name: dubbo    #引入dubbo协议,dubbo内部默认实现
        port: 20880    #每一个服务都应该有个各自对应的端口
            
    mybatis-plus:
      type-aliases-package: com.jt.dubbo.pojo       #配置别名包路径
      mapper-locations: classpath:/mybatis/mappers/*.xml  #添加mapper映射文件
      configuration:
        map-underscore-to-camel-case: true                #开启驼峰映射规则
    
    1. 配置costumer项目
      消费者作用:
      消费者目的通过接口动态的获取服务端的数据。消费者利用RPC(具体协议http/dubbo……)获取服务端数据。

    1.costumer项目不用连接数据库,需要的东西调用provider项目的服务获取返回的数据即可

    //给costumer项目的启动类加上以下注解
    //排除数据源启动
    @SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
    public class SpringBoot_Run {
    	
    	public static void main(String[] args) {
    		
    		SpringApplication.run(SpringBoot_Run.class, args);
    	}
    }
    

    2.编辑costumer的controller

    @RestController
    public class UserController {
    	
    	/**
    	 * timeout:定义连接超时时间
    	 * check:消费者启动时检查是否有服务的提供者
    	 * 
    	 * 调整负载均衡策略:loadbalance
    	 * 		1.随机策略	random
    	 * 		2.轮询策略	roundrobin
    	 * 		3.IPHash策略 consistenthash
    	 * 		4.最小访问策略 leastactive
    	 * 		
    	 */
    	 //dubbo的@Reference标识这个是服务消费者的
    	@Reference(timeout=3000,check=true,loadbalance = "leastactive")
    	private UserService userService;
    	
    	@RequestMapping("/findAll")
    	public List<User> findAll(){
    		//调用远程服务器中数据 rpc
    		return userService.findAll();
    	}
    	
    	//测试新增操作   如果名称与对象中的属性一致,则可以使用对象直接接收 
    	@RequestMapping("/saveUser/{name}/{age}/{sex}")
    	public String saveUser(User user) {
    		
    		userService.saveUser(user);
    		return "用户入库成功!!!";
    	}
    }
    

    3.配置costumer项目的配置文件

    server:
      port: 9001
    dubbo:
      scan:
        basePackages: com.jt  #指定包路径
      application:
        name: consumer-user   #业务标识   
      registry:			#zk的ip地址要换成自己的
        address: zookeeper://192.168.64.128:2181?backup=192.168.64.128:2182,192.168.64.128:2183
    

    dubbo负载均衡的实现

    如果采用集中式的负载均衡(Nginx),则负载均衡服务器的处理能力将制约整个服务器的性能。
    在这里插入图片描述
    在微服务中,一般采用客户端负载均衡服务器,有效地提高服务器效率。
    在这里插入图片描述
    调整负载均衡策略:loadbalance
    实现:(在costumer服务里的@Reference注解注入对象时加入以下属性即可完成不同的负载均衡策略)

    1. 随机策略:当dubbo有多个服务的消费者时,默认条件下采用随机策略。(random)
    @Reference(timeout=3000,check=true,loadbalance="random")
       private UserService userService;
    
    1. 轮询策略:每个服务器依次访问。(roundrobin)
    @Reference(timeout=3000,check=true,loadbalance="roundrobin")
       private UserService userService;
    
    1. IPHash策略:发起的访问通过ip hash计算到一个特定的服务器,就只访问这个服务器。(consistenthash)
    //类名: ConsistentHashLoadBalance
    //配置名称: consistenthash
    @Reference(timeout=3000,check=true,loadbalance="consistenthash")
       private UserService userService;
    
    1. 最小访问策略:发起的请求访问访问数量最小的一个服务器。(leastactive)
    @Reference(timeout=3000,check=true,loadbalance="leastactive")
       private UserService userService;
    

    补充

    提供者宕机不会影响消费者的使用。因为zk的心跳机制:当提供者重启时,zk有自动发现功能。当服务器重启时,会动态的维护服务列表数据。
    zk集群宕机,用户依然可以访问提供者, 由于dubbo启动时,会链接注册中心,将服务列表数据保存到本地(消费者内存中);当用户下次访问时,根据内存中的数据进行负载均衡;如果这时提供者宕机,那么消费者在尝试链接后发现服务宕机,则会动态的修改本地的服务列表信息标识为down。

    展开全文
  • 经常遇到上线后出现一些莫名其妙的问题,特别是线上调用第三方dubbo服务的时候,如果没有输出返回结果信息,如何排查是否是第三方dubbo接口返回的数据有问题,还是我们本身的代码有问题呢,下面这段代码可以实现在...

    经常遇到上线后出现一些莫名其妙的问题,特别是线上调用第三方dubbo服务的时候,如果没有输出返回结果信息,如何排查是否是第三方dubbo接口返回的数据有问题,还是我们本身的代码有问题呢,下面这段代码可以实现在本地环境直接调用线上的dubbo服务接口,并输出响应结果,来帮助我们定位问题。直接拷贝代码修改一下dubbo服务IP和请求的接口。

    package com.test;
    
    import com.alibaba.dubbo.config.ApplicationConfig;
    import com.alibaba.dubbo.config.ReferenceConfig;
    import com.alibaba.fastjson.JSON;
    import com.baj.product.client.domain.product.ItemSkuQuery;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    
    /**
     * @Author: pengCheng
     * @Date: 2021/4/14 12:52
     * @Description : 本地调用线上dubbo接口
     */
    
    public class LocalReqDubbo {
    
        //dubbo服务名 替换自己的
        static String serviceInterface = "com.baj.product.client.service.product.ItemSkuReadService";
        //要调用的接口名 替换自己的
        static String methodName = "queryList";
        //替换成自己dubbo服务ip
        static String dubboURl = "dubbo://XXX.XXX.XXX.XXX:10086";
    
        public static void main(String[] args) {
    
            ReferenceConfig reference = new ReferenceConfig();
    
            // 查询参数
            try {
                Class<?> forName = Class.forName(serviceInterface);
                // 1. 获取dubbo服务链接
                Object object = init(reference, forName);
                // 2. 校验获取方法
                Method method = getMethod(forName);
    
                // 3. 设置查询参数,接口中多个参数,使用数组形式赋值。
                Object[] objectArgs = new Object[1];
                // 构建请求参数,请根据自己的实际情况修改
                ItemSkuQuery query = new ItemSkuQuery();
                query.setCurPage(1);
                query.setPageSize(1000);
                query.setState(1);
                query.setShopCode("1075");
                objectArgs[0] = query;
    
                // 4. 指定方法,参数 调用dubbo接口方法
                Object invokeResult = method.invoke(object, objectArgs[0]);
                // 5. 打印参数调用结果
                System.out.println("invokeResult = [" + JSON.toJSONString(invokeResult) + "]");
    
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 获取需要调用的方法
         * @param forName
         * @return
         */
        private static Method getMethod(Class<?> forName) {
            Method[] methods = forName.getMethods();
            for (Method m : methods) {
                if (methodName.equals(m.getName())) {
                    return m;
                }
            }
    
            return null;
        }
    
        private static Object init(ReferenceConfig reference, Class<?> forName) {
            reference.setApplication(new ApplicationConfig("remote-test"));
            reference.setInterface(forName);
            reference.setUrl(dubboURl);
            //超时时间
            reference.setTimeout(30000);
            //服务版本号
            reference.setVersion("1.0.2");
            Object o = reference.get();
            return o;
        }
    
    }

    响应结果如下:

    展开全文
  • 首先会分析Dubbo是如何进行远程服务调用的,如果不了解dubbo的服务暴露和服务调用,请去看前两篇dubbo的文章,然后后面我还会说一下dubbo的SPI机制 Dubbo远程服务调用 Dubbo中的SPI机制的使用和分析 ...
  • dubbo远程服务调用简单demo实现

    千次阅读 2018-11-23 16:48:28
    Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起。 单一应用框架(ORM)  当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。  缺点:单一的...
  • 使用Dubbo&zk进行远程调用

    千次阅读 2019-10-03 17:17:07
    关于Dubbo的学习,Dubbo官网写的简单易懂[Dubbo官网](http://dubbo.apache.org/en-us/docs/user/quick-start.html),如果有时间没必要网上找了,基本也是官网一大抄。如果赶时间了解下可以参考下面的内容。
  • nested exception is com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method getBrandList in the service com.xxx.sellergoods.service.xxxService. Tried 3 times of the providers [192.168.204.1:...
  • 这是一个基于spring+dubbo开发的小demo。主要用于学习基于spring+dubbo框架的开发流程。用将此项目作为学习使用python进行dubbo接口测试的服务端程序。 1. 创建Dubbo项目 1.1 使用Maven创建多模块项目 因为这是一个...
  • m01-nacos-dubbo-api m01-nacos-dubbo-provider m01-nacos-dubbo-consumer 本示例使用的版本如下: Spring Cloud Version Spring Cloud Alibaba Version Spring Boot Version Finchley.SR1 2.0.2.RELE
  • 最近项目中dubbo远程调用的错误,zookeeper为注册中心,启动项目时错误,项目启动一般就卡了,显示就像启动一样,实际上是有错误了,后来加入日志,发现: Will not attempt to authenticate using SASL (unknown ...
  • Dubbo远程调用

    2021-05-25 16:53:34
    文章目录前言一、Dubbo调用介绍二、Dubbo协议三、编码与解码四、Telnet调用原理 前言 Dubbo核心调用流程 Dubbo协议详解 Dubbo编解码器原理 Telnet调用原理 Dubbo线程模型 一、Dubbo调用介绍 假如手写简单的RPC调用...
  • 2.其次dubbo使用的是rpc协议传输数据是可变的,而springcloud使用的是http协议只能传输固定的数据,并且http传输的数据会比较大,所以rpc协议相对于http的传输速度要快, 3.最后http协议是跨语言,跨平台的,而rpc...
  • 简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别...
  • 基于Dubbo实现rpc远程调用 以下是springboot整合dubbo实现rpc远程调用的简单示例。 使用的框架: jdk1.8 springboot-2.3.0 dubbo-2.6 zookeeper-3.4.9 一、开发dubbo服务接口: 按照dubbo官方开发建议,创建一个...
  • 关注“Java艺术”一起来充电吧!在前面分析Dubbo注册中心层源码的文章中,我们知道,服务的导出与引入由RegistryProtocol调度完成。对于服务提供者,服务是先导出再注册到注...
  • 面试杀手锏之Dubbo服务调用过程

    万次阅读 多人点赞 2020-09-14 08:51:58
    同步调用,这是我们最常用的,也就是 Dubbo 框架帮助我们异步转同步了,从代码可以看到在 Dubbo 源码中就调用了 future.get,所以给用户的感觉就是我调用了这个接口的方法之后就阻塞住了,必须要等待结果到了之后...
  • dubbo源码浅析-远程服务调用流程

    千次阅读 2018-05-29 17:22:49
    转载自:dubbo源码浅析(五)-远程服务调用流程非商业转载,如造成侵权,请联系本人删除消费端调用远程服务接口时,使用上和调用普通的java接口是没有任何区别,但是服务消费者和提供者是跨JVM和主机的,客户端如何...
  • Dubbo服务调用过程?

    2020-09-21 15:58:54
    首先我们已经知晓了远程服务的地址,然后我们要做的就是把我们要调用方法具体信息告知远程服务,让远程服务解析这些信息。 然后根据这些信息找到对应的实现类,然后进行调用调用完了之后再原路返回,然后客户端...
  • 解决dubbo无法访问远程服务提供者 问题由来:在本地写了一个服务提供者用dubbo将服务暴露出去(即注册到服务中心zookeeper),再在服务消费者用dubbo发现服务,结果没有出现问题。但当服务提供者放在云服务器上后,...
  • 实现Springcloud向dubbo项目的接口调用。 FeignToDubbo-starter模块负责利用Feign将底层的Http协议转化为dubbo协议,供SpringCloud项目使用。引入FeignToDubbo-starter后会引入dubbo的依赖,使用注解DubboRefence...
  • Dubbo的项目一定是多模块的父子工程的项目 ...服务提供者,服务调用者 配置appaction.properties文件 使用Dubbo的核心注解 进行接口请求测试 为了大家少走弯路,我决定重新搭建一次, 避免更多的人去踩坑 .
  • 前面写了一篇博客dubbo中拦截返回值和参数(针对consumer端),那个是没有...服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响...
  • 在大数据中,Flink任务一般都不是基于Spring框架和Dubbo框架的,但很多业务系统采用Dubbo架构,当需要调用业务系统的接口获取数据时,就出现Flink调用Dubbo的情况了。 由于Flink架构的特殊性,按照普通的Java项目...
  • import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; /** @author @create20200526 18:58 */ public...
  • 目录 通过dubbo提供mybatisplus分页查询服务 ...4.更改mybatisplus封装方法类 5.新建MabtisConfig配置类 6.查看dubbo-admin 调用者 1.导入依赖 2.编写Controller 3.新增两个实体类 4.编写Service 5.测试 ...
  • 一.Spring @Async异步方法Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;... 异步调用则是只是发送了调用的指令,调用者无需等待被调用方法完全执行完毕;而是继续执行下面的流
  • springboot远程调用dubbo服务接口

    千次阅读 2019-10-16 10:53:37
    我是java程序员可以关注我一起学习哈! 1.首先idea新建一个springboot项目,这里简单介绍下: 2.在springboot启动类上加入注解 @ImportResource(locations = {"classpath*:dubbo_config/*.xml"}) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,458
精华内容 10,983
关键字:

java的dubbo无法调用远程方法

java 订阅