zoukankan      html  css  js  c++  java
  • 32、SpringBoot-整合Dubbo

    分布式应用

    在分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring,

    Spring Boot+Spring Cloud。

    分布式系统:

     Zookeeper和Dubbo

    ZooKeeper
    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。
    它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、
    域名服务、分布式同步、组服务等。
    Dubbo 
    Dubbo是Alibaba开源的分布
    式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个
    层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo
    采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,
    所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

     

     dockers安装zookeeper

     

    官方运行的解释命令:

    启动:

    整合dubbo的依赖

    测试代码的使用:

    服务提供者:

    引入依赖:

    <dependency>
        <groupId>com.alibaba.boot</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>0.2.0</version>
    </dependency>

    提供服务的接口类:

    这个类在服务消费者中也要进行使用
    所以此时需要保证该类的所在包位置相同
    在开发中可以将该类与实体类提取出来,然后再引入到工程中进行使用
    如使用maven工程进行打包成jar
    package com.cr.provider.service;
    public interface TicketService {
        public String getTicket();
    }

    服务接口类的实现:

    package com.cr.provider.service.impl;
    
    import com.alibaba.dubbo.config.annotation.Service;
    import com.cr.provider.service.TicketService;
    import org.springframework.stereotype.Component;
    
    
    @Component
    //import com.alibaba.dubbo.config.annotation.Service;
    @Service//暴露服务
    public class TicketServiceImpl implements TicketService {
        @Override
        public String getTicket() {
            return "战狼2";
        }
    }
    此时的@Service是将服务的实现暴露出去,该注解中还有许多的配置,如超时等
    @Component是将该类加入到spring容器中

    配置文件: 

    #名字
    dubbo.application.name=provider
    #
    dubbo.registry.address=zookeeper://192.168.43.157:2181
    #
    dubbo.registry.protocol=zookeeper
    #
    dubbo.protocol.name=dubbo
    dubbo.protocol.port=20880
    #
    dubbo.monitor.protocol=registry
    #
    dubbo.scan.base-packages=com.cr.provider.service

    主程序:

    package com.cr.provider;
    
    
    import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @EnableDubbo
    public class ProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class, args);
        }
    
    }
    @EnableDubbo用于开启关于dubbo的注解

    服务消费者

    引入依赖: 

    <dependency>
        <groupId>com.alibaba.boot</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>0.2.0</version>
    </dependency>
    服务消费者调用的服务提供者实现的接口类
    此时的两个工程中的报名必须一致
    开发中使用工程引入依赖
    package com.cr.provider.service;
    
    public interface TicketService {
        public String getTicket();
    }

    用于调用TicketService实现的方法

    package com.cr.consumer.service;
    
    public interface UserService {
        public void hello();
    }

    实现类

    package com.cr.consumer.service.impl;
    
    import com.alibaba.dubbo.config.annotation.Reference;
    import com.cr.consumer.service.UserService;
    import com.cr.provider.service.TicketService;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        @Reference
        TicketService ticketService;
    
    
        public void hello(){
            System.out.println("ticketService:" + ticketService);
            String ticket = ticketService.getTicket();
            System.out.println("buy:" + ticket);
        }
    }
    @Reference用于自动注入dubbo容器中的服务
     
    配置:
    dubbo.application.name=consumer
    dubbo.registry.address=zookeeper://192.168.43.157:2181

    主类中:

    @EnableDubbo
    @SpringBootApplication
    public class ConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
    }

    用于开发Dubbo的注解@EnableDubbo

    测试时:服务提供者必须处于工作的状态

    @Autowired
    UserService userService;
    @Test
    public void tt(){
        userService.hello();
    }

    测试结果:

    @Reference

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
    public @interface Reference {
    
        Class<?> interfaceClass() default void.class;
    
        String interfaceName() default "";
    
        String version() default "";
    
        String group() default "";
    
        String url() default "";
    
        String client() default "";
    
        boolean generic() default false;
    
        boolean injvm() default false;
    
        boolean check() default true;
    
        boolean init() default false;
    
        boolean lazy() default false;
    
        boolean stubevent() default false;
    
        String reconnect() default "";
    
        boolean sticky() default false;
    
        String proxy() default "";
    
        String stub() default "";
    
        String cluster() default "";
    
        int connections() default 0;
    
        int callbacks() default 0;
    
        String onconnect() default "";
    
        String ondisconnect() default "";
    
        String owner() default "";
    
        String layer() default "";
    
        int retries() default 0;
    
        String loadbalance() default "";
    
        boolean async() default false;
    
        int actives() default 0;
    
        boolean sent() default false;
    
        String mock() default "";
    
        String validation() default "";
    
        int timeout() default 0;
    
        String cache() default "";
    
        String[] filter() default {};
    
        String[] listener() default {};
    
        String[] parameters() default {};
    
        String application() default "";
    
        String module() default "";
    
        String consumer() default "";
    
        String monitor() default "";
    
        String[] registry() default {};
    
    }
    

      

     @Service

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE})
    @Inherited
    public @interface Service {
    
        Class<?> interfaceClass() default void.class;
    
        String interfaceName() default "";
    
        String version() default "";
    
        String group() default "";
    
        String path() default "";
    
        boolean export() default false;
    
        String token() default "";
    
        boolean deprecated() default false;
    
        boolean dynamic() default false;
    
        String accesslog() default "";
    
        int executes() default 0;
    
        boolean register() default false;
    
        int weight() default 0;
    
        String document() default "";
    
        int delay() default 0;
    
        String local() default "";
    
        String stub() default "";
    
        String cluster() default "";
    
        String proxy() default "";
    
        int connections() default 0;
    
        int callbacks() default 0;
    
        String onconnect() default "";
    
        String ondisconnect() default "";
    
        String owner() default "";
    
        String layer() default "";
    
        int retries() default 0;
    
        String loadbalance() default "";
    
        boolean async() default false;
    
        int actives() default 0;
    
        boolean sent() default false;
    
        String mock() default "";
    
        String validation() default "";
    
        int timeout() default 0;
    
        String cache() default "";
    
        String[] filter() default {};
    
        String[] listener() default {};
    
        String[] parameters() default {};
    
        String application() default "";
    
        String module() default "";
    
        String provider() default "";
    
        String[] protocol() default {};
    
        String monitor() default "";
    
        String[] registry() default {};
    
    }
  • 相关阅读:
    Pulp之四:其它应用样例(1)-一般的整数规划问题 (设置目标约束函数)
    Pulp之三:官网上的应用样例(4)-Blending Problem (混合问题)
    Pulp之三:官网上的应用样例(3)-Sudoku Problem by LP (数独问题)
    Pulp之三:官网上的应用样例(2)-A Set Partitioning Problem (集合划分问题)
    list转换dict的方式以及zip的用法
    Pulp之三:官网上的应用样例(1)-The_Whiskas_Problem (猫粮配料比例问题)
    Pulp之二:Pulp中几个重要的概念
    一个简单有趣的题(4个变量找出取走的数)
    Java之父 James Gosling 发表博文 《Too Soon》纪念乔布斯。
    第01课 OpenGL窗口(1)
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10475470.html
Copyright © 2011-2022 走看看