Springboot_Dubbo_Zookeeper整合的三種方式
三種方式如下:
1:在application.yml中配置屬性,@Service【暴露服務】,@Reference【參考服務】,@EnableDubbo【開啟基于注解的dubbo功能】(詳情請見Apache Dubbo 框架的使用(三、四))
2:保留provider.xml、consumer.xml組態檔(需要注釋application.yml相關dubbo配置屬性),使用@ImportResource匯入dubbo的組態檔即可
3:使用注解API的方式,將每一個組件手動創建到容器中,讓dubbo來掃描其他的組件
1.使用XML的方式進行整合
注意(關于配置覆寫關系):
1:方法級優先,介面級次之,全域配置再次之(先考慮)
2:如果級別一樣,則消費方優先,提供方次之
provider.xml(生產者)相關配置資訊:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 1:指定當前服務/應用的名字(同樣的服務名字相同,不要和別的服務同名) -->
<dubbo:application name="boot-provider"></dubbo:application>
<!-- 2:指定注冊中心的位置、啟動時檢查 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" check="true"></dubbo:registry>
<!--或者-->
<!--<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>-->
<!-- 3:指定通信規則(通信協議?通信埠)-->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
<!-- 4:宣告需要暴露的服務介面 ref:指向服務的真正的實作物件、超時、重試次數、多版本 -->
<dubbo:service interface="com.kd.opt.service.FoodService" ref="foodServiceImpl" timeout="1000" retries="3" version="1.0.0">
<!-- 配置提供者方法一(foodServiceImpl實作類)、單個方法超時、單個方法重試次數 -->
<dubbo:method name="getFoodAll" timeout="1000" retries="3"></dubbo:method>
<!-- 配置提供者方法二(foodServiceImpl實作類)、單個方法超時、單個方法重試次數 -->
<dubbo:method name="getFoodAllNew" timeout="1000" retries="3"></dubbo:method>
</dubbo:service>
<!-- ref:指向服務的真正的實作物件(服務的實作) -->
<bean id="foodServiceImpl" class="com.kd.opt.service.impl.FoodServiceImpl"/>
<!-- 5:配置多版本 -->
<dubbo:service interface="com.kd.opt.service.FoodService" ref="foodServiceImpl2" timeout="1000" retries="3" version="2.0.0">
<!-- 配置提供者方法一(foodServiceImpl2實作類)、單個方法超時、單個方法重試次數 -->
<dubbo:method name="getFoodAll" timeout="1000" retries="3"></dubbo:method>
<!-- 配置提供者方法二(foodServiceImpl2實作類)、單個方法超時、單個方法重試次數 -->
<dubbo:method name="getFoodAllNew" timeout="1000" retries="3"></dubbo:method>
</dubbo:service>
<bean id="foodServiceImpl2" class="com.kd.opt.service.impl.FoodServiceImpl2"/>
<!-- 6:監控中心配置(自動發現)-->
<dubbo:monitor protocol="registry"></dubbo:monitor>
<!--或者-->
<!--<dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>-->
<!-- 7:配置當前提供者的統一規則,全部服務超時屬性,全部服務重試次數 -->
<dubbo:provider timeout="1000" retries="3"></dubbo:provider>
</beans>
consumer.xml(消費者)相關配置資訊:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 1:指定當前服務/應用的名字(同樣的服務名字相同,不要和別的服務同名) -->
<dubbo:application name="boot-consumer"></dubbo:application>
<!-- 2:指定注冊中心的位置、啟動時檢查 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" check="true"></dubbo:registry>
<!--或者-->
<!--<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>-->
<!-- 3:宣告需要呼叫的遠程服務的介面,生成遠程服務代理、啟動時檢查、超時、重試次數、多版本、本地存根 -->
<dubbo:reference id="userService" interface="com.kd.opt.service.FoodService" check="true" timeout="6000" retries="3" version="2.0.0" stub="com.kd.opt.service.impl.FoodServiceImpl3">
<!-- 配置消費者呼叫提供者的方法一(foodServiceImpl實作類)、單個方法超時、單個方法重試次數 -->
<dubbo:method name="getFoodAll" timeout="6000" retries="3"></dubbo:method>
<!-- 配置消費者呼叫提供者的方法二(foodServiceImpl實作類)、單個方法超時、單個方法重試次數 -->
<dubbo:method name="getFoodAllNew" timeout="6000" retries="3"></dubbo:method>
</dubbo:reference>
<!-- 4:監控中心配置(自動發現)-->
<dubbo:monitor protocol="registry"></dubbo:monitor>
<!--或者-->
<!--<dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>-->
<!-- 5:配置當前消費者的統一規則,全部服務啟動時檢查,全部服務超時屬性,全部服務重試次數,全部服務多版本,全部服務本地存根 -->
<dubbo:consumer check="true" timeout="6000" retries="3" version="1.0.0" stub="com.kd.opt.service.impl.FoodServiceImpl3"></dubbo:consumer>
</beans>
專案結構如下(boot-interface-all、boot-provider、boot-consumer):

boot-interface-all 更新代碼如下(參考Apache Dubbo 框架的使用(三、四)):
package com.kd.opt.service;
import com.kd.opt.entity.Food;
import java.util.List;
public interface FoodService {
/**
* 獲取全部食物資訊(方法一)
*
* @return
* @author 小辰哥哥
*/
List<Food> getFoodAll();
/**
* 獲取全部食物資訊(方法二)
*
* @return
* @author 小辰哥哥
*/
List<Food> getFoodAllNew();
}
package com.kd.opt.service;
import com.kd.opt.entity.User;
public interface UserService {
/**
* 獲取用戶相關資訊(方法一)
*
* @return
* @author 小辰哥哥
*/
User getUserAndFood();
/**
* 獲取用戶相關資訊(方法二)
*
* @return
* @author 小辰哥哥
*/
User getUserAndFoodNew();
}
package com.kd.opt.service.impl;
import com.kd.opt.entity.Food;
import com.kd.opt.service.FoodService;
import java.util.List;
/**
* 實作FoodService介面(本地存根)
*
* @author 小辰哥哥
*/
public class FoodServiceImpl3 implements FoodService {
private final FoodService foodService;
/**
* 傳入的是FoodService遠程代理物件
*
* @author 小辰哥哥
* @param foodService
*/
public FoodServiceImpl3(FoodService foodService) {
this.foodService = foodService;
}
@Override
public List<Food> getFoodAll() {
// 相當于個攔截器,可以先進行一系列的小驗證
if("1".equals("0")){
// 當不滿足某種條件時,回傳值為Null
return null;
}
return foodService.getFoodAll();
}
@Override
public List<Food> getFoodAllNew() {
// 相當于個攔截器,可以先進行一系列的小驗證
if("1".equals("0")){
// 當不滿足某種條件時,回傳值為Null
return null;
}
return foodService.getFoodAllNew();
}
}

boot-provider 更新代碼如下(參考Apache Dubbo 框架的使用(三、四)):
# 日志級別設定
logging:
level:
root: info # 最基礎的日志輸出級別
com.kd.opt: debug # 指定包下的日志輸出級別
org.springframework.web: debug # 指定類下的日志輸出級別
# 埠號和背景關系路徑
server:
port: 8088
servlet:
context-path: /boot-provider
# 支持名稱相同的bean的覆寫(如果不配置的話會發生報錯)
spring:
main:
allow-bean-definition-overriding: true

package com.kd.opt.service.impl;
import com.kd.opt.entity.Food;
import com.kd.opt.service.FoodService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* 實作FoodService介面
*
* @author 小辰哥哥
*/
// org.springframework.stereotype.Service(Spring家的)
@Service
public class FoodServiceImpl implements FoodService {
// 列印日志
private static final Logger LOGGER = LoggerFactory.getLogger(FoodServiceImpl.class);
@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","螺螄粉"));
// 測驗Dubbo超時屬性(睡眠5秒)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.debug("呼叫完成");
return foodList;
}
@Override
public List<Food> getFoodAllNew() {
// 創建一個ArrayList集合模擬資料庫
List<Food> foodList = new ArrayList<>();
foodList.add(new Food("7","炸雞"));
foodList.add(new Food("8","火鍋"));
foodList.add(new Food("9","過橋米線"));
// 測驗Dubbo超時屬性(睡眠5秒)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.debug("呼叫完成");
return foodList;
}
}
package com.kd.opt.service.impl;
import com.kd.opt.entity.Food;
import com.kd.opt.service.FoodService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* 實作FoodService介面
*
* @author 小辰哥哥
*/
// org.springframework.stereotype.Service(Spring家的)
@Service
public class FoodServiceImpl2 implements FoodService {
// 列印日志
private static final Logger LOGGER = LoggerFactory.getLogger(FoodServiceImpl2.class);
@Override
public List<Food> getFoodAll() {
// 創建一個ArrayList集合模擬資料庫
List<Food> foodList = new ArrayList<>();
foodList.add(new Food("4","麻辣燙"));
foodList.add(new Food("5","土豆粉"));
foodList.add(new Food("6","冷面"));
// 測驗Dubbo超時屬性(睡眠5秒)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.debug("呼叫完成");
return foodList;
}
@Override
public List<Food> getFoodAllNew() {
// 創建一個ArrayList集合模擬資料庫
List<Food> foodList = new ArrayList<>();
foodList.add(new Food("10","黃燜雞"));
foodList.add(new Food("11","烤鴨"));
foodList.add(new Food("12","干豆腐"));
// 測驗Dubbo超時屬性(睡眠5秒)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.debug("呼叫完成");
return foodList;
}
}
package com.kd.opt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
// 引入provider.xml檔案
@ImportResource(locations = "classpath:provider.xml")
public class BootProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootProviderApplication.class, args);
}
}

boot-consumer 更新代碼如下(參考Apache Dubbo 框架的使用(三、四)):
# 日志級別設定
logging:
level:
root: info # 最基礎的日志輸出級別
com.kd.opt: debug # 指定包下的日志輸出級別
org.springframework.web: debug # 指定類下的日志輸出級別
package com.kd.opt.service.impl;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 實作UserService介面
*
* @author 小辰哥哥
*/
// org.springframework.stereotype.Service(Spring家的)
@Service
public class UserServiceImpl implements UserService {
// 引入食物業務層(依賴注入)
@Autowired
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;
}
@Override
public User getUserAndFoodNew() {
// 獲取食物相關資訊
List<Food> foodList = foodService.getFoodAllNew();
// 創建一個用戶物件
User user = new User();
user.setUserId("002");
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();
}
@RequestMapping(value = "/getUserAndFoodNew",method = RequestMethod.GET)
public User getUserAndFoodNew(){
return userService.getUserAndFoodNew();
}
}
package com.kd.opt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
// 引入consumer.xml檔案
@ImportResource(locations = "classpath:consumer.xml")
public class BootConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(BootConsumerApplication.class, args);
}
}
防止踩坑1(啟動專案后不報錯 ,但是最后一行資訊一直是[Dubbo] Current Spring Boot Application is await…):

發生的原因可能是pom.xml中缺少Springboot的相關依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
加入后成功:

防止踩坑2(沒有啟動dubbo Simple Monitor監控中心,發生報錯):

2.使用注解API的方式進行整合
Provider.java(生產者)相關配置資訊:
package com.kd.opt.config;
import com.alibaba.dubbo.config.*;
import com.kd.opt.service.FoodService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* 使用注解API的方式,將每一個組件手動創建到容器中(生產者)
*
* @author 小辰哥哥
*/
@Configuration
public class Provider {
// 依賴注入實作類1
@Resource(name = "foodServiceImpl")
private FoodService foodService1;
// 依賴注入實作類2
@Resource(name = "foodServiceImpl2")
private FoodService foodService2;
/**
* 對應xml中dubbo:application標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public ApplicationConfig applicationConfig(){
// 創建一個新物件
ApplicationConfig applicationConfig = new ApplicationConfig();
// 1:指定當前服務/應用的名字(同樣的服務名字相同,不要和別的服務同名)
applicationConfig.setName("boot-provider");
return applicationConfig;
}
/**
* 對應xml中dubbo:registry標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public RegistryConfig registryConfig(){
// 創建一個新物件
RegistryConfig registryConfig = new RegistryConfig();
// 2:指定注冊中心的位置、啟動時檢查
registryConfig.setAddress("127.0.0.1:2181");
registryConfig.setProtocol("zookeeper");
registryConfig.setCheck(true);
return registryConfig;
}
/**
* 對應xml中dubbo:protocol標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public ProtocolConfig protocolConfig(){
// 創建一個新物件
ProtocolConfig protocolConfig = new ProtocolConfig();
// 3:指定通信規則(通信協議?通信埠)
protocolConfig.setPort(20880);
protocolConfig.setName("dubbo");
return protocolConfig;
}
/**
* 對應xml中dubbo:service與dubbo:method標簽(foodServiceImpl實作類)
*
* @author 小辰哥哥
* @return
*/
@Bean
public ServiceConfig<FoodService> serviceConfig1(){
// 創建一個新物件
ServiceConfig<FoodService> serviceConfig = new ServiceConfig<>();
// 4:宣告需要暴露的服務介面 ref:指向服務的真正的實作物件、超時、重試次數、多版本
serviceConfig.setInterface(FoodService.class);
serviceConfig.setRef(foodService1);
serviceConfig.setTimeout(6000);
serviceConfig.setRetries(3);
serviceConfig.setVersion("1.0.0");
// 配置提供者方法一(foodServiceImpl實作類)、單個方法超時、單個方法重試次數
MethodConfig methodConfig1 = new MethodConfig();
methodConfig1.setName("getFoodAll");
methodConfig1.setTimeout(6000);
methodConfig1.setRetries(3);
// 配置提供者方法二(foodServiceImpl實作類)、單個方法超時、單個方法重試次數
MethodConfig methodConfig2 = new MethodConfig();
methodConfig2.setName("getFoodAllNew");
methodConfig2.setTimeout(6000);
methodConfig2.setRetries(3);
// 首先創建一個List集合存放多個方法
List<MethodConfig> methods = new ArrayList<>();
methods.add(methodConfig1);
methods.add(methodConfig2);
// 將methodConfig的設定關聯到serviceConfig中
serviceConfig.setMethods(methods);
// 暴露及注冊服務(必須填寫,否則消費者找不到生產者)
serviceConfig.setApplication(applicationConfig());
serviceConfig.setRegistry(registryConfig());
serviceConfig.setProtocol(protocolConfig());
serviceConfig.export();
return serviceConfig;
}
/**
* 對應xml中dubbo:service與dubbo:method標簽(foodServiceImpl2實作類)
*
* @author 小辰哥哥
* @return
*/
@Bean
public ServiceConfig<FoodService> serviceConfig2(){
// 創建一個新物件
ServiceConfig<FoodService> serviceConfig = new ServiceConfig<>();
// 5:配置多版本
serviceConfig.setInterface(FoodService.class);
serviceConfig.setRef(foodService2);
serviceConfig.setTimeout(6000);
serviceConfig.setRetries(3);
serviceConfig.setVersion("2.0.0");
// 配置提供者方法一(foodServiceImpl2實作類)、單個方法超時、單個方法重試次數
MethodConfig methodConfig3 = new MethodConfig();
methodConfig3.setName("getFoodAll");
methodConfig3.setTimeout(6000);
methodConfig3.setRetries(3);
// 配置提供者方法二(foodServiceImpl2實作類)、單個方法超時、單個方法重試次數
MethodConfig methodConfig4 = new MethodConfig();
methodConfig4.setName("getFoodAllNew");
methodConfig4.setTimeout(6000);
methodConfig4.setRetries(3);
// 首先創建一個List集合存放多個方法
List<MethodConfig> methods = new ArrayList<>();
methods.add(methodConfig3);
methods.add(methodConfig4);
// 將methodConfig的設定關聯到serviceConfig中
serviceConfig.setMethods(methods);
// 暴露及注冊服務(必須填寫,否則消費者找不到生產者)
serviceConfig.setApplication(applicationConfig());
serviceConfig.setRegistry(registryConfig());
serviceConfig.setProtocol(protocolConfig());
serviceConfig.export();
return serviceConfig;
}
/**
* 對應xml中dubbo:monitor標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public MonitorConfig monitorConfig(){
// 創建一個新物件
MonitorConfig monitorConfig = new MonitorConfig();
// 6:監控中心配置(自動發現)
monitorConfig.setProtocol("registry");
return monitorConfig;
}
/**
* 對應xml中dubbo:provider標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public ProviderConfig providerConfig(){
// 創建一個新物件
ProviderConfig providerConfig = new ProviderConfig();
// 7:配置當前提供者的統一規則,全部服務超時屬性,全部服務重試次數
providerConfig.setTimeout(6000);
providerConfig.setRetries(3);
return providerConfig;
}
}
Consumer.java(消費者)相關配置資訊:
package com.kd.opt.config;
import com.alibaba.dubbo.config.*;
import com.kd.opt.service.FoodService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
* 使用注解API的方式,將每一個組件手動創建到容器中(消費者)
*
* @author 小辰哥哥
*/
@Configuration
public class Consumer {
// 日志列印
private static final Logger LOGGER = LoggerFactory.getLogger(Consumer.class);
/**
* 對應xml中dubbo:application標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public ApplicationConfig applicationConfig(){
// 創建一個新物件
ApplicationConfig applicationConfig = new ApplicationConfig();
// 1:指定當前服務/應用的名字(同樣的服務名字相同,不要和別的服務同名)
applicationConfig.setName("boot-consumer");
return applicationConfig;
}
/**
* 對應xml中dubbo:registry標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public RegistryConfig registryConfig(){
// 創建一個新物件
RegistryConfig registryConfig = new RegistryConfig();
// 2:指定注冊中心的位置、啟動時檢查
registryConfig.setAddress("127.0.0.1:2181");
registryConfig.setProtocol("zookeeper");
registryConfig.setCheck(true);
return registryConfig;
}
/**
* 對應xml中dubbo:reference與dubbo:method標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public ReferenceConfig<FoodService> referenceConfig(){
// 創建一個新物件
ReferenceConfig<FoodService> referenceConfig = new ReferenceConfig<>();
// 3:宣告需要呼叫的遠程服務的介面,生成遠程服務代理、啟動時檢查、超時、重試次數、多版本、本地存根
referenceConfig.setInterface(FoodService.class);
referenceConfig.setCheck(true);
referenceConfig.setTimeout(6000);
referenceConfig.setRetries(3);
referenceConfig.setVersion("2.0.0");
referenceConfig.setStub("com.kd.opt.service.impl.FoodServiceImpl3");
// 配置消費者呼叫提供者的方法一(foodServiceImpl實作類)、單個方法超時、單個方法重試次數
MethodConfig methodConfig1 = new MethodConfig();
methodConfig1.setName("getFoodAll");
methodConfig1.setTimeout(6000);
methodConfig1.setRetries(3);
// 配置消費者呼叫提供者的方法二(foodServiceImpl實作類)、單個方法超時、單個方法重試次數
MethodConfig methodConfig2 = new MethodConfig();
methodConfig2.setName("getFoodAllNew");
methodConfig2.setTimeout(6000);
methodConfig2.setRetries(3);
// 首先創建一個List集合存放多個方法
List<MethodConfig> methods = new ArrayList<>();
methods.add(methodConfig1);
methods.add(methodConfig2);
// 將methodConfig的設定關聯到referenceConfig中
referenceConfig.setMethods(methods);
// 注意:此代理物件內部封裝了所有通訊細節,物件較重,請快取復用
referenceConfig.setApplication(applicationConfig());
referenceConfig.setRegistry(registryConfig());
FoodService foodService = referenceConfig.get();
LOGGER.debug("獲取foodService相關資料:"+foodService.getFoodAll());
return referenceConfig;
}
/**
* 對應xml中dubbo:monitor標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public MonitorConfig monitorConfig(){
// 創建一個新物件
MonitorConfig monitorConfig = new MonitorConfig();
// 4:監控中心配置(自動發現)
monitorConfig.setProtocol("registry");
return monitorConfig;
}
/**
* 對應xml中dubbo:consumer標簽
*
* @author 小辰哥哥
* @return
*/
@Bean
public ConsumerConfig consumerConfig(){
// 創建一個新物件
ConsumerConfig consumerConfig = new ConsumerConfig();
// 5:配置當前消費者的統一規則,全部服務啟動時檢查,全部服務超時屬性,全部服務重試次數,全部服務多版本,全部服務本地存根
consumerConfig.setCheck(true);
consumerConfig.setTimeout(6000);
consumerConfig.setRetries(3);
consumerConfig.setVersion("2.0.0");
consumerConfig.setStub("com.kd.opt.service.impl.FoodServiceImpl3");
return consumerConfig;
}
}
boot-interface-all 專案結構(沒變化,參考XML配置的方式整合):

boot-provider 專案結構:

代碼更新如下:
# 日志級別設定
logging:
level:
root: info # 最基礎的日志輸出級別
com.kd.opt: debug # 指定包下的日志輸出級別
org.springframework.web: debug # 指定類下的日志輸出級別
# 埠號和背景關系路徑
server:
port: 8088
servlet:
context-path: /boot-provider
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 {
// 列印日志
private static final Logger LOGGER = LoggerFactory.getLogger(FoodServiceImpl.class);
@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","螺螄粉"));
// 測驗Dubbo超時屬性(睡眠5秒)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.debug("呼叫完成");
return foodList;
}
@Override
public List<Food> getFoodAllNew() {
// 創建一個ArrayList集合模擬資料庫
List<Food> foodList = new ArrayList<>();
foodList.add(new Food("7","炸雞"));
foodList.add(new Food("8","火鍋"));
foodList.add(new Food("9","過橋米線"));
// 測驗Dubbo超時屬性(睡眠5秒)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.debug("呼叫完成");
return foodList;
}
}
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 FoodServiceImpl2 implements FoodService {
// 列印日志
private static final Logger LOGGER = LoggerFactory.getLogger(FoodServiceImpl2.class);
@Override
public List<Food> getFoodAll() {
// 創建一個ArrayList集合模擬資料庫
List<Food> foodList = new ArrayList<>();
foodList.add(new Food("4","麻辣燙"));
foodList.add(new Food("5","土豆粉"));
foodList.add(new Food("6","冷面"));
// 測驗Dubbo超時屬性(睡眠5秒)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.debug("呼叫完成");
return foodList;
}
@Override
public List<Food> getFoodAllNew() {
// 創建一個ArrayList集合模擬資料庫
List<Food> foodList = new ArrayList<>();
foodList.add(new Food("10","黃燜雞"));
foodList.add(new Food("11","烤鴨"));
foodList.add(new Food("12","干豆腐"));
// 測驗Dubbo超時屬性(睡眠5秒)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.debug("呼叫完成");
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(scanBasePackages = "com.kd.opt")
public class BootProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootProviderApplication.class, args);
}
}
boot-consumer 專案結構:

代碼更新如下:
# 日志級別設定
logging:
level:
root: info # 最基礎的日志輸出級別
com.kd.opt: debug # 指定包下的日志輸出級別
org.springframework.web: debug # 指定類下的日志輸出級別
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;
}
@Override
public User getUserAndFoodNew() {
// 獲取食物相關資訊
List<Food> foodList = foodService.getFoodAllNew();
// 創建一個用戶物件
User user = new User();
user.setUserId("002");
user.setUserName("大豬妹妹");
user.setUserAge("18");
user.setFoodList(foodList);
return user;
}
}
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(scanBasePackages = "com.kd.opt")
public class BootConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(BootConsumerApplication.class, args);
}
}
總結
每天一個提升小技巧!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/280664.html
標籤:其他
