简介
Dubbo是一阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC(所谓的RPC指的是远程调用,就像调用本地方法一样调用另外项目中的代码) 实现服务的输出和输入功能,可以和 Spring框架无缝集成。更详细的可以去
在学习dubbo之前必须明白几个概念
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
他们之间的关系是:
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
zookeeper的下载安装:
创建项目
这里是将服务接口,也就是我们常说的service层创建一个单独的项目方便调用,也就是dubbo-service
dubbo-provider:服务的提供者
dubbo-consumer:服务的消费者
dubbo-service中只有一个很简单的接口
package com.jbit.service;
public interface HelloDubboService {
public String print();
}
然后就是总项目的pom.xml文件!!!这里尤其要注意jar包依赖,有需要的可以看:
父依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
dependencies
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--项目dubbo-service的依赖-->
<dependency>
<groupId>com.jbit.dubbo</groupId>
<artifactId>dubbo-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入dubbo的依赖-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入zookeeper的依赖 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
dubbo-service的依赖根据自己的改
接下来是dubbo-provider
dubbo-provider
HelloDubboService的实现HelloDubboServiceImpl
package com.jbit.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.jbit.service.HelloDubboService;
@Service(version = "1.0.0",interfaceClass = HelloDubboService.class)
public class HelloDubboServiceImpl implements HelloDubboService {
public String print() {
return "-------hello Dubbo-------";
}
}
这里尤其是注意@Service注解是dubbo下面的
启动类
package com.jbit;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class,args);
}
}
application.yml
server:
port: 8081
dubbo:
application:
name: dubbo-provider
registry:
protocol: zookeeper
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
scan: com.jbit.service.impl.HelloDubboServiceImpl
如果想要暴露多个接口,使得逗号拼接即可,例
注意空格的对齐及自己dubbo的端口号,也就是
dubbo-consumer
配置大致差不多,因为服务提供者已经暴露出接口了,所以我们不需要再写,只需要写相应的控制层调用即可
DubboController
这里要注意@Reference注解也是dubbo的
package com.jbit.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.jbit.service.HelloDubboService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.Serializable;
@RestController
@RequestMapping("dubbo")
public class DubboController {
@Reference(version = "1.0.0")
private HelloDubboService helloDubboService;
@RequestMapping("print")
public String print() {
System.out.println(helloDubboService);
return helloDubboService.print();
}
}
启动类DubboConsumerApplication
package com.jbit;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class,args);
}
}
application.yml
server:
port: 8082
dubbo:
application:
name: dubbo-consumer
registry:
protocol: zookeeper
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20881
测试
先启动zookeeper,再启动服务提供者,也就是dubbo-provider,等待加载完后启动dubbo-consumer,访问http://localhost:8082/dubbo/print (如果自己改变了就调用自己相应的)
可以看到已经成功!!!
大致流程
这里的大致流程就是服务的提供者启动后将自己的服务注册到zookeeper中,然后消费者启动的时候需要使用什么服务就到zookeeper中取着使用