Dubbo 快速入门
1、环境准备:
先确保linux系统jdk环境已经安装,把下载好的压缩包上传到linux
# 先确保jdk环境已经安装
cd /usr/local# 把压缩包上传到linux系统,解压
tar -zxvf zookeeper-3.4.6.tar.gz
# 进入zookeeper-3.4.6目录
cd zookeeper-3.4.6
# 进入conf目录
cd conf
# 把zoo_sample.cfg 改名为zoo.cfg
mv zoo_sample.cfg zoo.cfg
# 打开zoo.cfg文件, 修改dataDir属性
vi zoo.cfg
# 设置zoo.cfg放置数据的目录
dataDir=/usr/local/zookeeper-3.4.6/data# 保存退出
# 进入bin目录下
cd /usr/local/zookeeper-3.4.6/bin# 启动服务命令
./zkServer.sh start
2、创建Demo项目
示例项目分为三个,分别是:
1. dubbo-api:提供统一的接口,最终会打为jar包,供consumer和provider引用
2.dubbo-provider:服务提供者,包含api接口的实现类,提供服务的实现逻辑
3.dubbo-consumer:该项目是一个web项目,有几个作用,首先该项目以http的形式提供前端和浏览器访问的接口,其次,该项目也是dubbo消费者,用来消费dubbo-provider项目提供的服务。
2.1、首先开发dubbo-api:
该项目只有一个文件,是一个接口,他定义了统一的接口让provider和consumer来引用,接口文件内容如下:
package cn.itcast.api;
public interface UserApi {
String sayHi(String name);
User findById(Long id);
}
public class User implements Serializable {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.2、接着我们开发dubbo-provider,项目结构如下:
该项目只有两个类,一个是服务实现类UserServiceImpl,代码如下:
/** * 使用dubbo提供的@Service注解 * 1. 导入的包:org.apache.dubbo.config.annotation.Service * 2. 注意:不要导入spring的包 org.springframework.stereotype.Service */ //@Service(timeout = 3000,retries = 1)// 设置超时时间(默认1000),重试次数(默认2次) //@Service(version = "2.0") // version指定服务版本,演示灰色发布,服务消费者可以设置指定要访问的版本 @Service(weight = 200) //如果有多个相同版本的服务提供者,消费者该如何调用?这就需要用到负载均衡 public class UserApiImpl implements UserApi { @Override public String sayHi(String name) { return "hi," + name; } @Override public User findById(Long id) { /* try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }*/ User user = new User(); user.setId(1l); user.setName("张三"); // System.out.println("UserApiImpl服务版本2.0"); return user; } }
另外一个是SpringBoot启动类:
@SpringBootApplication public class UserServiceApplication { public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); } }
还有一个yml配置文件:
# springboot项目对外暴漏的端口(web项目就是访问端口)
server:
port: ${port:9001} # 表示端口默认为9001;如果运行时期通过VM Option传入port参数,以传入为主。
dubbo:
application:
# 项目名称,用于计算服务的依赖关系。(区分不同项目的服务)
name: dubbo-service-user
# 指定zk注册中心地址
registry:
address: zookeeper://192.168.200.130:2181
protocol:
# 对外暴漏的服务使用的协议:dubbo协议, 官网推荐
name: dubbo
# 对外暴漏服务的端口
port: ${dport:20881} # 表示端口默认为20881;dport是动态传入的参数名称,可以随意定义
# dubbo包扫描,会扫描dubbo提供的@Service注解
scan:
base-packages: cn.itcast.api
以及pom文件导入的依赖:
<!--指定SpringBoot继承的父项目--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> </parent> <dependencies> <!--依赖Api接口工程--> <dependency> <groupId>cn.itcast</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--web启动器,传递依赖了tomcat--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--dubbo的起步依赖--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.5</version> </dependency> <!-- zookeeper的api管理依赖 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.2.0</version> </dependency> <!-- zookeeper依赖 --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> </dependencies>
2.3、最后来看dubbo-consumer这个web项目,相对来说也是三个项目中最为负责的一个
项目结构:
OrderController类就是个控制器,使用requestMapping注解提供http接口服务,内容如下:
/** * 负载均衡策略(4种): * * random :按权重随机,默认值。按权重设置随机概率。 * roundrobin :按权重轮询。 * leastactive:最少活跃调用数,相同活跃数的随机。 * consistenthash:一致性 Hash,相同参数的请求总是发到同一提供者。 */ /** * 集群容错模式: * * Failover Cluster:失败重试。默认值。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作 * Failfast Cluster :快速失败,只发起一次调用,失败立即报错。通常用于写操作。(不重试) * Failsafe Cluster :失败安全,出现异常时,直接忽略。返回一个空结果。(一般用于不太重要的操作,比如消息通知) * Failback Cluster :失败自动恢复,后台记录失败请求,定时重发。(一般用于非常重要的操作) * Forking Cluster :并行调用多个服务器,只要一个成功即返回。 * Broadcast Cluster :广播调用所有提供者,逐个调用,任意一台报错则报错 */ @RestController @RequestMapping("order") public class OrderController { /** * @Reference * 1、导入dubbo提供的注解:org.apache.dubbo.config.annotation.Reference * 2、用于对指定的接口生成代理对象,通过代理封装远程调用相关代码,实现远程调用 */ // @Reference(version = "2.0")//调用指定的服务版本 // @Reference(loadbalance = "random")// 负载均衡策略:按权重随机,默认值。按权重设置随机概率 // @Reference(loadbalance = "consistenthash")// 负载均衡策略:一致性 Hash,相同参数的请求总是发到同一提供者。 // @Reference(cluster = "failover") //设置消费者集群容错模式:失败重试。默认值。默认重试2次,使用 retries 配置。 // @Reference(cluster = "failfast")//快速失败. 注意:区分大小写 // @Reference(cluster = "forking")//并行调用多个服务器 // @Reference(cluster = "broadcast") @Reference private UserApi userApi; @GetMapping("hello") public String hello() { // 执行RPC远程调用, 获取dubbo服务返回结果. 在浏览器显示 return userApi.sayHi("Tom"); } /** * 根据用户id查询用户信息。 * http://localhost:18080/order/user/1 */ @GetMapping("/user/{id}") public User findUserById(@PathVariable("id") Long id){ User user = userApi.findById(id); return user; } }
接下来看yml配置文件:
server:
port: 18080
dubbo:
# 项目名称,用于计算服务的依赖关系。(区分不同项目的服务)
application:
name: order-web-manager
# 注册中心地址
registry:
address: zookeeper://192.168.200.130:2181
然后就是导入的依赖有哪些:
<dependencies> <!--依赖Api接口工程--> <dependency> <groupId>cn.itcast</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--dubbo的起步依赖--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.5</version> </dependency> <!-- zookeeper的api管理依赖 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.2.0</version> </dependency> <!-- zookeeper依赖 --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> </dependencies>
3、启动项目
需要先启动服务提供者,再启动服务消费者,访问消费者中的控制器的方法即可远程调用服务提供者
http://localhost:18080/order/hello
http://localhost:18080/order/user/1