美文网首页
Java-分布式框架-Dubbo-2

Java-分布式框架-Dubbo-2

作者: 蓝色_笔记本 | 来源:发表于2021-08-26 11:10 被阅读0次

一、Dubbo 快速入门

Dubbo核心功能解释

dubbo 阿里开源的一个SOA服务治理框架,从目前来看把它称作是一个RPC远程调用框架更为贴切。单从RPC框架来说,功能较完善,支持多种传输和序列化方案。所以想必大家已经知道他的核心功能了:就是远程调用

image.png
Java Dubbo的远程调用
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.4.1</version>
</dependency>
<!--注册中心为zookeeper-->
<dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo-registry-zookeeper</artifactId>
      <version>2.7.4.1</version>
</dependency>
<!--接口组件-->
<dependency>
      <groupId>application-compent</groupId>
      <artifactId>member-client</artifactId>
      <version>1.0-SNAPSHOT</version>
</dependency>
image.png

服务端

public class DubboServer {

    public static void main(String[] args) throws IOException {
        // 开始 暴露 UserService 服务
        // application
        // protocol -dubbo 协议
        // register
        // service
        ApplicationConfig applicationConfig = new ApplicationConfig("sample-app");
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setSerialization("fastjson");
        protocolConfig.setPort(-1);//20880
        RegistryConfig registryConfig = new RegistryConfig("zookeeper://192.168.0.147:2181");

        ServiceConfig serviceConfig = new ServiceConfig();
        serviceConfig.setInterface("com.tuling.client.UserService");
        serviceConfig.setRef(new UserServiceImpl());
        serviceConfig.setRegistry(registryConfig);
        serviceConfig.setProtocol(protocolConfig);
        serviceConfig.setApplication(applicationConfig);
//        serviceConfig.setToken(true);
//        setLoadbalance(serviceConfig);
        serviceConfig.export();
        System.out.println("服务已暴露");
        System.in.read();
    }

    public static void setLoadbalance(ServiceConfig serviceConfig) {
        serviceConfig.setLoadbalance("consistenthash");
        MethodConfig methodConfig = new MethodConfig();
        methodConfig.setName("findUser");
        Map<String, String> paramter = new HashMap<>();
        paramter.put("hash.arguments", "0,1");
        paramter.put("hash.nodes", "320");
        methodConfig.setParameters(paramter);
        serviceConfig.setMethods(Arrays.asList(methodConfig));
    }

    public static void setMock(ServiceConfig serviceConfig, String server) {
        serviceConfig.setRef(new MockService(server));
    }
}

注意:在引用Dubbo包的时候注意dubbo版本问题,新版本引用的是apache下面的jar包。

public class DubboClient {

    public static void main(String[] args) throws IOException {
        RegistryConfig registryConfig = new RegistryConfig("zookeeper://192.168.0.147:2181"); // 虚拟的注册中心 局域网
        ApplicationConfig applicationConfig = new ApplicationConfig("young-app");
        ReferenceConfig referenceConfig = new ReferenceConfig();
        referenceConfig.setRegistry(registryConfig);
        referenceConfig.setApplication(applicationConfig);
        referenceConfig.setTimeout(3000);
        referenceConfig.setInterface(UserService.class);
        referenceConfig.setFilter("-firstFilter");

        UserService userService = (UserService) referenceConfig.get();

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            String line = bufferedReader.readLine();
            if (line.equals("quit")) {
                break;
            }
           System.out.println(userService.getUser(1));
        }
    }
}
Spring Dubbo的远程调用

共用接口

public interface UserService {
    User getUser(Integer id);
}

provide.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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="young-app"/>
    <dubbo:registry address="multicast://224.1.1.1:3333"/>
    <!-- check 是否要检查注册中心可用 默认true-->
    <dubbo:protocol name="dubbo" port="-1"/>
    <dubbo:service interface="com.tuling.client.UserService" ref="userService"
                   timeout="4000">
        <dubbo:method name="getUser" timeout="2000"/>
    </dubbo:service>

    <bean id="userService" class="com.tuling.dubbo.UserServiceImpl"></bean>
</beans>

consumer.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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    <dubbo:application name="simple-app"/>
    <dubbo:registry address="multicast://224.1.1.1:3333"/>
    <dubbo:consumer timeout="5000"/>
    <dubbo:reference id="userService" interface="com.tuling.client.UserService" async="false">
    </dubbo:reference>
</beans>

服务端

public class SpringServer {
    public static void main(String[] args) throws IOException {
        new ClassPathXmlApplicationContext("provide.xml");
        System.out.println("服务已暴露");
        System.in.read();
    }
}

客户端

public class SpringClient {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
        UserService userService = context.getBean(UserService.class);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            if (bufferedReader.readLine().equals("quit")) {
                break;
            }
            System.out.println(userService.getUser(1));
        }
    }
}
SpringBoot Dubbo的远程调用

共用接口

public interface UserService {
    User getUser(Integer id);
}

服务端

dubbo.application.name=simple
dubbo.registry.address=multicast://224.1.1.1:3333
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
@EnableDubbo
@SpringBootApplication
public class BootServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootServerApplication.class, args);
        System.out.println("服务已开启");
    }
}
@Service
@Component
public class UserServiceImpl implements UserService {
    @Override
    public User getUser(Integer id) {
        User user = new User();
        user.setId(id);
        user.setName("luban:" + ManagementFactory.getRuntimeMXBean().getName());
        user.setSex("man");
        return user;
    }
}

客户端

dubbo.application.name=young
dubbo.registry.address=multicast://224.1.1.1:3333
@EnableDubbo
@SpringBootApplication
public class DemoApplication {
    @Reference
    UserService userService;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args).close();
    }

    @Bean
    public ApplicationRunner getBean() {
        return args -> {
            System.out.println(userService.getUser(1));
        };
    }
}

二、Dubbo常规配置说明

标签 用途 解释
<dubbo:application/> 公共 用于配置当前应用信息,不管该应用是提供者还是消费者
<dubbo:registry/> 公共 用于配置连接注册中心相关信息
<dubbo:protocol/> 服务 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受
<dubbo:service/> 服务 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心
<dubbo:provider/> 服务 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选
<dubbo:consumer/> 引用 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选
<dubbo:reference/> 引用 用于创建一个远程服务代理,一个引用可以指向多个注册中心
<dubbo:method/> 公共 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息
<dubbo:argument/> 公共 用于指定方法参数配置
配置关系图
image.png
配置优先级
image.png

三、Dubbo调用模块概述

dubbo调用模块核心功能是发起一个远程方法的调用并顺利拿到返回结果,其体系组成如下:

  1. 透明代理:通过动态代理技术,屏蔽远程调用细节以提高编程友好性。
  2. 负载均衡:当有多个提供者是,如何选择哪个进行调用的负载算法。
  3. 容错机制:当服务调用失败时采取的策略
  4. 调用方式:支持同步调用、异步调用
image.png

相关文章

  • Java-分布式框架-Dubbo-2

    一、Dubbo 快速入门 Dubbo核心功能解释 dubbo 阿里开源的一个SOA服务治理框架,从目前来看把它称作...

  • JAVA-Mock测试框架简记-2017-2-7 18:38:3

    JAVA-常用Mock测试框架 EasyMock 早期比较流行的MocK测试框架 mockito EasyMock...

  • Java-分布式框架-rocketmq

    一、消息中间件对比 kafkaRocketMQRabbitMQ定位设计定位系统间的数据流管道,实时数据处理。例如常...

  • Java-分布式框架-ShardingSphere

    一、基本介绍 ShardingSphere定位为关系型数据库中间件 功能列表 功能列表数据分片分布式事务数据库治理...

  • Java-分布式框架-zookeeper

    一、产生背景 项目从单体到分布式转变之后,将会产生多个节点之间协同的问题。如: 1.每天的定时任务由谁哪个节点来执...

  • Java-分布式框架-Kafka

    一、概述 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(r...

  • Java-分布式框架-redis-4

    redis分布式锁redisson 分布式框架中,普通锁是满足不了业务需求的,分布式锁在分布式框架中不可缺失;比如...

  • Java-分布式框架-redis-3

    一、Redis哨兵集群弊端 redis3.0之前比较可靠的集群就是哨兵集群,主从节点,主节点拥有写与读的权限,从节...

  • Java-分布式框架-redis-5

    一、概述 一个高并发的框架中,往往会设置多层缓存,比如Nginx应用层的缓存、web层JVM中的缓存、redis集...

  • Java-分布式框架-Dubbo-1

    一、分布式架构的发展历史与背景 分布式系统(distributed system)是建立在网络之上的软件系统。正是...

网友评论

      本文标题:Java-分布式框架-Dubbo-2

      本文链接:https://www.haomeiwen.com/subject/thlhiltx.html