【zookeeper+Dubbo】Dubbo與SpringBoot整合的三種方式

一、使用yml或者properties等配置文件

新建code-boot的項目

依賴爲

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

新建code-boot的子項目:boot-gmall-interface,有一個類,兩個接口

package com.atguigu.gmall.bean;

import java.io.Serializable;

public class UserAddress implements Serializable {

    private Integer Id;
    private String userAddress;

    @Override
    public String toString() {
        return "UserAddress{" +
                "Id=" + Id +
                ", userAddress='" + userAddress + '\'' +
                ", userId='" + userId + '\'' +
                ", consignee='" + consignee + '\'' +
                ", phneNum='" + phneNum + '\'' +
                ", isDefault='" + isDefault + '\'' +
                '}';
    }

    private String userId;

    public Integer getId() {
        return Id;
    }

    public void setId(Integer id) {
        Id = id;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getConsignee() {
        return consignee;
    }

    public void setConsignee(String consignee) {
        this.consignee = consignee;
    }

    public String getPhneNum() {
        return phneNum;
    }

    public void setPhneNum(String phneNum) {
        this.phneNum = phneNum;
    }

    public String getIsDefault() {
        return isDefault;
    }

    public void setIsDefault(String isDefault) {
        this.isDefault = isDefault;
    }

    private String consignee;
    private String phneNum;
    private String isDefault;

    public UserAddress() {
        super();
    }

    public UserAddress(Integer id, String userAddress, String userId, String consignee, String phneNum, String isDefault) {
        Id = id;
        this.userAddress = userAddress;
        this.userId = userId;
        this.consignee = consignee;
        this.phneNum = phneNum;
        this.isDefault = isDefault;
    }
}
package com.atguigu.gmall.service;

import com.atguigu.gmall.bean.UserAddress;

import java.util.List;

public interface OrderService {
    /**
     * 初始化訂單
     * @param userId
     */
    public List<UserAddress> initOrder(String userId);
}
package com.atguigu.gmall.service;

import com.atguigu.gmall.bean.UserAddress;

import java.util.List;

public interface UserService {
    /**
     *按照用戶id返回地址
     * @param userId
     * @return
     */
    public List<UserAddress> getUserAddressList(String userId);
}

 再次新建code-boot的子項目:boot-user-service-provider

依賴爲:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.atguigu</groupId>
            <artifactId>boot-gmall-interface</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
    </dependencies>

 yml配置文件

server:
  port: 8090
dubbo:
  application:
    name: user-service-provider
  registry:
    address: 127.0.0.1:2181
    protocol: zookeeper
    timeout: 5000
  protocol:
    name: dubbo
    port: 20881
  monitor:
    protocol: registry
  scan:
    base-packages: com.atguigu.gmall


啓動類 

@EnableDubbo  //開啓基於註解的dubbo功能
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args)  {
        SpringApplication.run(UserApplication.class);
    }
}

服務實現類

package com.atguigu.gmall.service.impl;

import java.util.Arrays;
import java.util.List;

import com.alibaba.dubbo.config.annotation.Service;
import com.atguigu.gmall.bean.UserAddress;
import com.atguigu.gmall.service.UserService;
import org.springframework.stereotype.Component;

@Service  //暴露服務
@Component
public class UserServiceImpl implements UserService {

	@Override
	public List<UserAddress> getUserAddressList(String userId) {
		System.out.println("UserServiceImpl.....old...");
		// TODO Auto-generated method stub
		UserAddress address1 = new UserAddress(1, "北京市昌平區宏福科技園綜合樓3層", "1", "李老師", "010-56253825", "Y");
		UserAddress address2 = new UserAddress(2, "深圳市寶安區西部硅谷大廈B座3層(深圳分校)", "1", "王老師", "010-56253825", "N");
		/*try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		return Arrays.asList(address1,address2);
	}

}

 再次新建code-boot的子項目:boot-order-service-consumer

依賴爲:

<dependencies>
    <dependency>
        <groupId>com.atguigu</groupId>
        <artifactId>boot-gmall-interface</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.boot</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>0.2.0</version>
    </dependency>
</dependencies>

 yml配置

server:
  port: 8091
dubbo:
  application:
    name: order-service-consumer
  registry:
    address: zookeeper://127.0.0.1:2181
  monitor:
    protocol: registry

 啓動項

package com.atguigu.gmall;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class);
    }
}

controller

 

package com.atguigu.gmall.controller;

import com.atguigu.gmall.bean.UserAddress;
import com.atguigu.gmall.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.Null;
import java.util.List;

@RestController
public class OrderController {
    @Autowired
    OrderService orderService;

    @RequestMapping("/initOrder")
    public List<UserAddress> initOrder(@RequestParam("uid") String userId){
       return orderService.initOrder(userId);
    }
}

service

package com.atguigu.gmall.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.atguigu.gmall.bean.UserAddress;
import com.atguigu.gmall.service.OrderService;
import com.atguigu.gmall.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 1.將服務提供者註冊到註冊中心
 *      1.1導入dubbo依賴(2.6.2)/操作zookeeper的客戶端(操作zookeeper的客戶端)
 *      1.2配置服務提供者
 * 2.讓服務消費者去註冊中心訂閱服務提供者和地址
 */
@Service
public class OrderServiceImpl implements OrderService {

//    @Autowired
//    @Reference(url = "127.0.0.1:20881")//dubbo直連
    @Reference//暴露服務
    UserService userService;
    @Override
    public List<UserAddress> initOrder(String userId){
        System.out.println("用戶id:"+ userId);
        List<UserAddress> addressList = userService.getUserAddressList(userId);

        return addressList;
    }
}

 然後將項目啓動,我們在瀏覽器地址欄輸入:localhost:8091/initOrder?uid=1

可以發現我們調用成功。

二、xml文件導入配置

將boot-user-service-provider的yml配置註釋掉,加上一個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://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!--1.指定當前服務/應用的名字()同樣的服務名字相同,不要和別的服務同名-->
    <dubbo:application name="user_service_provider"></dubbo:application>
    <!--2.指定註冊中心的位置-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"></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.atguigu.gmall.service.UserService" ref="userServiceImpl" ></dubbo:service>

    <!--4.服務的實現-->
    <bean id="userServiceImpl" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean>
    <!--4.鏈接監控中心-->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
</beans>

啓動測試即可,和一是一樣的。。 

三、使用註解api方式 將每個組件手動創建到容器中

將xml和yml配置均註釋,在boot-user-service-provider中添加一個配置文件

package com.atguigu.gmall.config;

import com.alibaba.dubbo.config.*;
import com.atguigu.gmall.service.UserService;
import org.apache.catalina.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.validation.constraints.Max;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class MyDubboConfig {
    @Bean
    public ApplicationConfig applicationConfig(){
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("boot-user-service-provider");
        return applicationConfig;
    }

    @Bean
    public RegistryConfig registryConfig(){
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setProtocol("zookeeper");
        registryConfig.setAddress("127.0.0.1:2181");
        return registryConfig;
    }
    @Bean
    public ProtocolConfig protocolConfig(){
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20882);
        return  protocolConfig;
    }
    @Bean
    public ServiceConfig<UserService> userServiceServiceConfig(UserService userService){
        ServiceConfig<UserService> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(UserService.class);
        serviceConfig.setRef(userService);
        serviceConfig.setVersion("1.0.0");

        //配置每一個method的信息
        MethodConfig methodConfig = new MethodConfig();
        methodConfig.setName("getUserAddressList");
        methodConfig.setTimeout(1000);

        //將method的設置保存到service的配置中
        List<MethodConfig> methodConfigs = new ArrayList<>();
        methodConfigs.add(methodConfig);
        serviceConfig.setMethods(methodConfigs);
        return serviceConfig;
    }
}

啓動然後測試,測試和一一樣。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章