文章目录
Springboot_Dubbo_Zookeeper整合
1.创建一个空工程(Empty Project)
项目名称:Springboot_Dubbo_Zookeeper_Demo1:
2.新建boot-interface-all模块(包括实体类,业务层接口总和)
项目结构:
相关代码:
package com.kd.opt.entity;
import java.io.Serializable;
/**
* 实体类——食物信息(模拟User与Food为一对多的关系)
*
* @author 小辰哥哥
*/
public class Food implements Serializable {
// 食物编号
private String foodId;
// 食物名称
private String foodName;
// 无参构造
public Food() {
}
// 有参构造
public Food(String foodId, String foodName) {
this.foodId = foodId;
this.foodName = foodName;
}
// get和set方法进行封装
public String getFoodId() {
return foodId;
}
public void setFoodId(String foodId) {
this.foodId = foodId;
}
public String getFoodName() {
return foodName;
}
public void setFoodName(String foodName) {
this.foodName = foodName;
}
// 重新toString方法
@Override
public String toString() {
return "Food{" +
"foodId='" + foodId + '\'' +
", foodName='" + foodName + '\'' +
'}';
}
}
package com.kd.opt.entity;
import java.io.Serializable;
import java.util.List;
/**
* 实体类——用户信息(模拟User与Food为一对多的关系)
*
* @author 小辰哥哥
*/
public class User implements Serializable {
// 用户编号
private String userId;
// 用户姓名
private String userName;
// 用户年龄
private String userAge;
// 食物列表信息
private List<Food> foodList;
// 无参构造
public User() {
}
// 有参构造
public User(String userId, String userName, String userAge, List<Food> foodList) {
this.userId = userId;
this.userName = userName;
this.userAge = userAge;
this.foodList = foodList;
}
// get和set方法进行封装
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
public List<Food> getFoodList() {
return foodList;
}
public void setFoodList(List<Food> foodList) {
this.foodList = foodList;
}
// 重写toString方法
@Override
public String toString() {
return "User{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", userAge='" + userAge + '\'' +
", foodList=" + foodList +
'}';
}
}
public interface FoodService {
/**
* 获取全部食物信息
*
* @author 小辰哥哥
* @return
*/
List<Food> getFoodAll();
}
public interface UserService {
/**
* 获取用户相关信息
*
* @author 小辰哥哥
* @return
*/
User getUserAndFood();
}
3.新建boot-provider模块(生产者)
引入dubbo依赖:
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
引入总接口(boot-interface-all)依赖:
<dependency>
<groupId>com.kd.opt</groupId>
<artifactId>boot-interface-all</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
项目结构:
yml相关配置(最基础):
# 日志级别设置
logging:
level:
root: info # 最基础的日志输出级别
com.kd.opt: debug # 指定包下的日志输出级别
org.springframework.web: debug # 指定类下的日志输出级别
# 端口号和上下文路径
server:
port: 8088
servlet:
context-path: /boot-provider
# 关于Dubbo相关的配置
# 1:指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名)
dubbo:
application:
name: boot-provider
# 2:指定注册中心的位置
registry:
address: 127.0.0.1:2181
protocol: zookeeper
# 3:指定通信规则(通信协议?通信端口)
protocol:
name: dubbo
port: 20880
# 4:声明需要暴露的服务接口 (ref:指向服务的真正的实现对象)
# ref:指向服务的真正的实现对象(服务的实现)------------在FoodServiceImpl实现类加入注解@Service(注意是com.alibaba.dubbo包下面的)
# 5:配置监控中心
monitor:
protocol: registry
业务层相关代码:
package com.kd.opt.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.kd.opt.entity.Food;
import com.kd.opt.service.FoodService;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 实现FoodService接口
*
* @author 小辰哥哥
*/
// 暴露服务(注意是com.alibaba.dubbo包下面的)
@Service
// 之前的@Service(spring家的)可以用@Component代替
@Component
public class FoodServiceImpl implements FoodService {
@Override
public List<Food> getFoodAll() {
// 创建一个ArrayList集合模拟数据库
List<Food> foodList = new ArrayList<>();
foodList.add(new Food("1","蓝色妖姬"));
foodList.add(new Food("2","骨肉相连"));
foodList.add(new Food("3","螺蛳粉"));
return foodList;
}
}
启动类相关代码:
package com.kd.opt;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
// 开启基于注解的dubbo功能
@EnableDubbo
public class BootProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootProviderApplication.class, args);
}
}
开始启动,注意提前开始Zookeeper服务:
4.新建boot-consumer模块(消费者)
引入dubbo依赖:
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
引入总接口(boot-interface-all)依赖:
<dependency>
<groupId>com.kd.opt</groupId>
<artifactId>boot-interface-all</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
项目结构:
yml相关配置(最基础):
# 日志级别设置
logging:
level:
root: info # 最基础的日志输出级别
com.kd.opt: debug # 指定包下的日志输出级别
org.springframework.web: debug # 指定类下的日志输出级别
# 关于Dubbo相关的配置
# 1:指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名)
dubbo:
application:
name: boot-consumer
# 2:指定注册中心的位置
registry:
protocol: zookeeper
address: 127.0.0.1:2181
# 3:声明需要调用的远程服务的接口:生成远程服务代理-----在实现类依赖注入使用@Reference注解
# 4:配置监控中心
monitor:
protocol: registry
业务层相关代码:
package com.kd.opt.service.impl;
import com.alibaba.dubbo.config.annotation.Reference;
import com.kd.opt.entity.Food;
import com.kd.opt.entity.User;
import com.kd.opt.service.FoodService;
import com.kd.opt.service.UserService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 实现UserService接口
*
* @author 小辰哥哥
*/
// org.springframework.stereotype.Service(Spring家的)
@Service
public class UserServiceImpl implements UserService {
// 引入食物业务层(依赖注入)
// 不在使用@Autowired注解
@Reference
private FoodService foodService;
@Override
public User getUserAndFood() {
// 获取食物相关信息
List<Food> foodList = foodService.getFoodAll();
// 创建一个用户对象
User user = new User();
user.setUserId("001");
user.setUserName("小辰哥哥");
user.setUserAge("18");
user.setFoodList(foodList);
return user;
}
}
控制器相关代码:
package com.kd.opt.controller;
import com.kd.opt.entity.User;
import com.kd.opt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
// 引入用户业务层(依赖注入)
@Autowired
private UserService userService;
@RequestMapping(value = "/getUserAndFood",method = RequestMethod.GET)
public User getUserAndFood(){
return userService.getUserAndFood();
}
}
启动类相关代码:
package com.kd.opt;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
// 开启基于注解的dubbo功能
@EnableDubbo
public class BootConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(BootConsumerApplication.class, args);
}
}
开始启动,注意提前开始Zookeeper服务,生产者服务:
5.开始测试
查看Dubbo管理控制台(具体安装启动,详见Apache Dubbo 框架的使用(二)):
查看Dubbo监控中心(具体安装启动,详见Apache Dubbo 框架的使用(二)):
访问控制器映射地址:
总结
每天一个提升小技巧!!!