第十四章-SpringBoot 与分布式
Dubbo 简介
分布式应用,国内常用组合 Zookeeper + Dubbo
SpringBoot 使用 SpringCloud
Zookeeper 分布式应用程序协调服务
Dubbo Alibaba 开源的分布式服务框架,服务提供方 Provider+ 服务消费方 Consumer
安装 zookeeper
docker pull zookeeper
# EXPOSE 2181 2888 3888 8080
docker run --name zk01 -p 2181:2181 --restart always -d zookeeper
创建一个空工程,两个 spring-web 模块
provider-ticket
consumer-ticket
1、将服务提供者注册到注册中心
2、引入 dubbo 和 zkclient 依赖
3、配置 dubbo 的扫描包和注册中心地址
4、使用@Service 发布服务
https://github.com/alibaba/dubbo-spring-boot-starter
provider-ticket 提供者
引入依赖 pom.xml
<dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> </dependency>
配置 application.properties
spring.dubbo.application.name=privoder-ticket spring.dubbo.server=true #注册中心地址 spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 spring.dubbo.scan=com.example.ticket.service
服务接口
package com.example.ticket.service; public interface TicketService { public String getTicket(); }
发布服务实现
package com.example.ticket.service.impl; import com.alibaba.dubbo.config.annotation.Service; import com.example.ticket.service.TicketService; import org.springframework.stereotype.Component; @Component @Service // 发布服务 public class TicketServiceImpl implements TicketService { @Override public String getTicket() { return "门票"; } }
开启配置可用
package com.example.ticket; import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableDubboConfiguration @SpringBootApplication public class ProviderTicketApplication { public static void main(String[] args) { SpringApplication.run(ProviderTicketApplication.class, args); } }
consumer-ticket 消费者
引入依赖
<dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> </dependency>
配置 application.properties
spring.dubbo.application.name=consumer-ticket
#注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
暴露接口
package com.example.ticket.service;
public interface TicketService {
public String getTicket();
}
用户服务接口
package com.example.ticket.service;
public interface UserService {
public String getTicket();
}
用户服务实现
package com.example.ticket.impl; import com.alibaba.dubbo.config.annotation.Reference; import com.example.ticket.service.TicketService; import com.example.ticket.service.UserService; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Reference TicketService ticketService; @Override public String getTicket() { return ticketService.getTicket(); } }
开启配置可用
package com.example.ticket; import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableDubboConfiguration @SpringBootApplication public class ConsumerTicketApplication { public static void main(String[] args) { SpringApplication.run(ConsumerTicketApplication.class, args); } }
测试
package com.example.ticket; import com.example.ticket.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class ConsumerTicketApplicationTests { @Autowired UserService userService; @Test void contextLoads() { String ticket = userService.getTicket(); System.out.println(ticket); } }