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