SpringBoot整合Zookeepr+Dubbo实现服务注册和发现
关于Zookeeper和Dubbo的原理在此略,请参考链接。默认已在本地安装了Zookeeper
1.服务提供者开发
1)新建一个SpringBoot的项目,导入依赖
<dependencies> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--引入springboot整合dubbo的jar包--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
2)在yml配置dubbo相关信息
server: port: 8001 dubbo: application: #dubbo的应用名称 name: dubbo-provider protocol: #协议名称 name: dubbo #协议端口 port: 20880 registry: #zk服务的地址 address: zookeeper://127.0.0.1:2181 provider: #服务的超时时间,单位是ms,默认是1000 timeout: 20000
由于dubbo是用于远程调用的,故需配置服务注册中心的相关信息
3)新建User实体类
package com.zys.entity; import lombok.Data; import java.io.Serializable; @Data public class User implements Serializable { private String name; private String pwd; }
注意:若要在dubbo中传递对象,那么此对象必须进行序列化,否则会报错。
4)新建service类,用于业务逻辑的接口类
package com.zys.service; import com.zys.entity.User; import java.util.List; public interface UserService { List<User> getList(); }
这里以模拟查询用户信息为例。
5)新建实现类,实现业务接口类
package com.zys.service.impl; import com.zys.entity.User; import com.zys.service.UserService; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service @com.alibaba.dubbo.config.annotation.Service public class UserServiceImpl implements UserService { @Override public List<User> getList() { List<User> list = new ArrayList<>(); for (int i = 1; i <= 5; i++) { User user = new User(); user.setName("张三" + i); user.setPwd("123" + i); list.add(user); } return list; } }
需要注意是的,这里用了两个@Service注解,但各自有作用。重要的是要引入dubbo的@service注解。只有使用此注解的类,才会被注册到zk中。因此需要使用远程调用的类再加上dubbo的@service注解即可,不需要远程调用的直接使用原来的@Service注解。
6)新建controller层,测试业务接口
package com.zys.controller; import com.zys.entity.User; import com.zys.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/get") public List<User> getList() { return userService.getList(); } }
这个controller的作用除了测试业务接口外,还可与服务消费者端的controller进行对比。
7)给启动类添加注解@EnableDubbo
2.服务消费者开发
1)新建一个SpringBoot的项目,导入依赖
<dependencies> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--引入springboot整合dubbo的jar包--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
2)在yml配置dubbo相关信息
server: port: 80 dubbo: application: #dubbo的应用名称 name: dubbo-consumer registry: #zk服务的地址 address: zookeeper://127.0.0.1:2181
这里只需要配置zk的地址和dubbo的应用名称。
3)新建service类
package com.zys.service; import com.zys.entity.User; import java.util.List; public interface UserService { List<User> getList(); }
此类必须和服务提供者中添加dubbo的@Service注解的接口类一致,包名也要一致,要调用的方法也需保持一致。这些服务都会注册到zk中,dubbo通过名称去查找并调用。
5)新建controller层,测试服务接口
package com.zys.controller; import com.alibaba.dubbo.config.annotation.Reference; import com.zys.entity.User; import com.zys.service.UserService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class TestController { @Reference private UserService userService; @GetMapping("/test") public List<User> test() { return userService.getList(); } }
在注入服务时使用的是dubbo的@Reference注解,只有通过这个注解才能调用到服务。
5)给启动类添加注解@EnableDubbo
6)先启动zk服务,再启动服提供者,最后启动服务消费者,先访问http://localhost:8001/get,返回正确信息:
调用http://localhost/test也会返回正确的信息,至此服务注册与调用已完成。