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 {};

}
原文地址:https://www.cnblogs.com/Mrchengs/p/10475470.html