前提:
Zookeeper服务都已开启
可以同时开启Dubbo-admin
提供者提供服务:
- 1、导入依赖
- 2、 配置注册中心的地址,以及服务发现名,和要扫描的包
- 3、在想要被注册的服务上面,增加一个注解@Service(Dubbo包下)
消费者进行消费:
- 1、导入依赖
- 2、配置注册中心的地址,以及服务器发现名
- 3、从远程注入服务 使用@Reference 而不是 @Autowired
Tips:
这里@Reference注入和注入Service思路一样,但是要注意的是本地一定要创建和提供端同样的接口名,- 例如:提供的叫TestService,消费的就要@Reference TestService 变量名;
DEMO
消费端、提供端依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.5</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
提供端配置
# 服务应用名字
dubbo:
application:
name: provider.server
# 注册中心地址
registry:
address: zookeeper://127.0.0.1:2181
# 扫描哪些服务需要被注册
scan:
base-packages: com.bw.demo.service
提供端接口
//Zookeeper服务注册与发现
//这里为了区别@Service尽量使用@Component
//如果非要用@Service,请看清,使用Dubbo的@Servcice
@Component
public class TestService {
public String getTicket(){
return "returnSomething";
}
}
消费端配置
#消费者去哪里拿服务,需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心(拿取位置)的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
消费端调用
@Service //消费者要在Service中选用Spring的@Service
public class Ticketconsumer {
//想拿到票
@Reference//使用Dubbo的引用,pom坐标,可以自定义路径相同的接口名(跟生产者)
TicketService ticketService;
public void buyTickect(){
String ticket = ticketService.getTicket();
System.out.println("获得票据:"+ticket);
}
}
迈向分布式
总结一下需要解决的四个核心分布式问题:
1、API网关 =》 服务路由
2、HTTP、RPC框架 =》 异步调用
3、服务注册与发现 =》 高可用
4、熔断机制 =》 服务降级
原因:
网络是不可靠的!