1.准备工作
首先创建一个空的项目,然后再项目里创建三个模块,分别为springboot-dubbo-interface,springboot-dubbo-provider,springboot-dubbo-consumer,其中springboot-dubbo-interface模块只是一个简单的maven工程,用来存放接口,在这里我把实体类也放在了该模块,而其他的两个是springboot项目。三个模块如下:
2.springboot-dubbo-interface实现
模块结构如下:
User.java:
package org.example.entity;import java.io.Serializable;public class User implements Serializable { private String name; private Integer age; private Integer id; private String address; private String phone; private String email; private String sex; public User() { } public User(String name, Integer age, Integer id, String address, String phone, String email, String sex) { this.name = name; this.age = age; this.id = id; this.address = address; this.phone = phone; this.email = email; this.sex = sex; } /** * 获取 * @return name */ public String getName() { return name; } /** * 设置 * @param name */ public void setName(String name) { this.name = name; } /** * 获取 * @return age */ public Integer getAge() { return age; } /** * 设置 * @param age */ public void setAge(Integer age) { this.age = age; } /** * 获取 * @return id */ public Integer getId() { return id; } /** * 设置 * @param id */ public void setId(Integer id) { this.id = id; } /** * 获取 * @return address */ public String getAddress() { return address; } /** * 设置 * @param address */ public void setAddress(String address) { this.address = address; } /** * 获取 * @return phone */ public String getPhone() { return phone; } /** * 设置 * @param phone */ public void setPhone(String phone) { this.phone = phone; } /** * 获取 * @return email */ public String getEmail() { return email; } /** * 设置 * @param email */ public void setEmail(String email) { this.email = email; } /** * 获取 * @return sex */ public String getSex() { return sex; } /** * 设置 * @param sex */ public void setSex(String sex) { this.sex = sex; } public String toString() { return "User{name = " + name + ", age = " + age + ", id = " + id + ", address = " + address + ", phone = " + phone + ", email = " + email + ", sex = " + sex + "}"; }}
注意:User类必需实现Serializable接口,因为后面User对象会从服务提供者传输到消费者,dubbo会序列化User对象。
UserService接口:
package org.example.service;import org.example.entity.User;public interface UserService { public User getUser();}
最后记得把该模块install一下。
3.springboot-dubbo-provider实现
模块结构如下:
pom.xml引入依赖:
org.springframework.bootspring-boot-starterorg.springframework.bootspring-boot-starter-testtestorg.examplespringboot-dubbo-interface1.0-SNAPSHOTorg.springframework.bootspring-boot-starter-webcom.alibaba.spring.bootdubbo-spring-boot-starter2.0.0com.101teczkclient0.11
application.properties:
#设置内嵌Tomcat端口号server.port=8082#设置上下文根server.servlet.context-path=/#设置dubbo的配置#服务提供者声明名称:必须保证服务名称的唯一性,它的名称是dubbo内部使用的唯一标识spring.application.name=springboot-integration-dubbo-service-provider#声明当前工程是一个服务提供者spring.dubbo.server=true#设置访问服务的协议及端口号,dubbo官方推荐使用的是dubbo协议,端口号默认20880spring.dubbo.protocol.name=dubbospring.dubbo.protocol.port=20880#指定zookeeper注册中心地址和端口号spring.dubbo.registry=zookeeper://127.0.0.1:2181
UserServiceImpl.java:
package com.example.service.impl;import com.alibaba.dubbo.config.annotation.Service;import org.example.entity.User;import org.example.service.UserService;import org.springframework.stereotype.Component;@Component@Service(timeout = 3000,retries = 2) // 当前服务三秒超时,超时后有两次重试,如果还是不成功,就不再重试public class UserServiceImpl implements UserService { @Override public User getUser() { User user = new User(); user.setId(10001); user.setAddress("河南****"); user.setAge(18); user.setName("张三"); user.setEmail("158361217272@163.com"); user.setPhone("158361217272"); user.setSex("男"); return user; }}
此处的@Service不再是以前的了,他是dubbo提供的,不要用错了,最后在启动类加上@EnableDubboConfiguration注解。
4.springboot-dubbo-consumer实现
模块结构如下:
pom文件和服务提供者一样,然后再引入一个lombok依赖:
org.projectlombok lombok 1.18.26 provided
application.properties:
#设置内嵌Tomcat端口号server.port=8083#设置上下文根server.servlet.context-path=/#设置dubbo的配置#服务提供者声明名称:必须保证服务名称的唯一性,它的名称是dubbo内部使用的唯一标识spring.application.name=springboot-integration-dubbo-consumer#指定zookeeper注册中心地址和端口号spring.dubbo.registry=zookeeper://127.0.0.1:2181
UserController:
package com.example.controller;import com.alibaba.dubbo.config.annotation.Reference;import lombok.extern.slf4j.Slf4j;import org.example.entity.User;import org.example.service.UserService;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/user")@Slf4jpublic class UserController { @Reference private UserService userService; @GetMapping public User getUser(){ log.info("请求了一次用户数据!"); return userService.getUser(); }}
注入的时候使用的是@Reference,他是dubbo提供的,不要用错了。
5.测试
- 启动zookeeper
- 启动provider
- 启动consumer
然后在浏览器访问127.0.0.1:8083/user,结果如下:
{"name":"张三","age":18,"id":10001,"address":"河南****","phone":"158361217272","email":"158361217272@163.com","sex":"男"}