Spring Cloud Alibaba | Dubbo Spring Cloud 之 HTTP 實戰

上一篇文章《Spring Cloud Alibaba | Dubbo 與 Spring Cloud 完美結合》咱們介紹了Dubbo Spring Cloud的基本使用,使用的服務中心爲Spring Cloud Alibaba提供的Nacos,Dubbo內部提供了基於Dubbo的RPC調用,同時,Dubbo Spring Cloud在整合了Spring Cloud以後,能夠直接提供HTTP接口,同Spring Cloud無縫銜接,直接支持Feign、RestTemplate等方式的遠程調用,在提供HTTP服務的同時能夠提供Dubbo服務。Dubbo Spring Cloud支持HTTP遠程調用級大的方便了咱們的對接外部系統,無需對Dubbo再作二次封裝。html

1. 案例實戰

接下來,咱們經過一個簡單的案例來介紹一下Dubbo Spring Cloud經過註解的方式是如何同時提供Dubbo服務和HTTP服務的。java

1.1 建立父工程dubbo-spring-cloud-http

工程依賴pom.xml以下:git

代碼清單:Alibaba/dubbo-spring-cloud-http/pom.xmlgithub


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Cloud Nacos Service Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

1.2 建立子工程dubbo_provider_web,服務提供方

工程依賴pom.xml以下:web

代碼清單:Alibaba/dubbo-spring-cloud-http/dubbo_provider_web/pom.xmlspring


<dependencies>
    <!-- API -->
    <dependency>
        <groupId>com.springcloud</groupId>
        <artifactId>dubbo_api</artifactId>
        <version>${project.version}</version>
    </dependency>
    <!-- Dubbo Spring Cloud Starter -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
</dependencies>

這裏引入Dubbo Spring Cloud工具包和Dubbo API依賴包。apache

配置文件參考上一節配置,這裏再也不贅述。api

接口實現類UserServiceI.java以下:app

代碼清單:Alibaba/dubbo-spring-cloud-http/dubbo_provider_web/src/main/java/com/springcloud/dubbo_provider_web/service/UserServiceI.javaide


@Service(version = "1.0.0")
@RestController
@Slf4j
public class UserServiceI implements UserService {

    private Map<Long, UserModel> usersRepository = Maps.newHashMap();

    @Override
    @PostMapping("/save")
    public UserModel save(@RequestBody UserModel user) {
        return usersRepository.put(user.getId(), user);
    }

    @Override
    @DeleteMapping("/remove")
    public void remove(@RequestParam("id") Long userId) {
        usersRepository.remove(userId);
    }

    @Override
    @GetMapping("/findAll")
    public Collection<UserModel> findAll() {
        return usersRepository.values();
    }
}
  • @Service註解有不少有關服務的配置屬性,這裏使用 version 定義當前接口版本,此處版本僅在 Dubbo 調用時生效, HTTP 調用無效,更多相關配置能夠參考源碼org.apache.dubbo.config.annotation.Service

1.3 建立子工程 spring_cloud_consumer , web 服務消費方

工程依賴pom.xml以下:

代碼清單:Alibaba/dubbo-spring-cloud-http/spring_cloud_consumer/pom.xml


<dependencies>
    <!-- API -->
    <dependency>
        <groupId>com.springcloud</groupId>
        <artifactId>dubbo_api</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

配置文件application.yml以下:

代碼清單:Alibaba/dubbo-spring-cloud-http/spring_cloud_consumer/src/main/resources/application.yml


server:
port: 8080
spring:
application:
    name: spring-cloud-consumer-server
cloud:
    nacos:
    discovery:
        server-addr: 192.168.44.129:8848

接口測試類UserController.java以下:

代碼清單:Alibaba/dubbo-spring-cloud-http/spring_cloud_consumer/src/main/java/com/springcloud/spring_cloud_consumer/controller/UserController.java


@RestController
public class UserController {

    @Autowired
    UserRemote userRemote;

    @Autowired
    RestTemplate restTemplate;

    @PostMapping("/saveByFeign")
    public UserModel saveByFeign(@RequestBody UserModel user) {
        return userRemote.save(user);
    }

    @DeleteMapping("/removeByFeign")
    public void removeByFeign(@RequestParam("id") Long userId) {
        userRemote.remove(userId);
    }

    @GetMapping("/findAllByFeign")
    public Collection<UserModel> findAllByFeign() {
        return userRemote.findAll();
    }

    @PostMapping("/saveByRestTemplate")
    public UserModel saveByRestTemplate(@RequestBody UserModel user) {
        return restTemplate.postForObject("http://dubbo-spring-cloud-provider-web/save/", user, UserModel.class);
    }

    @DeleteMapping("/removeByRestTemplate")
    public void removeByRestTemplate(@RequestParam("id") Long userId) {
        restTemplate.delete("http://dubbo-spring-cloud-provider-web/remove?id=" + userId);
    }

    @GetMapping("/findAllByRestTemplate")
    public Collection<UserModel> findAllByRestTemplate() {
        return restTemplate.getForObject("http://dubbo-spring-cloud-provider-web/findAll/", Collection.class);
    }
}

共計三個測試接口,這裏提供兩種測試方式,一種是經過Feign調用,另外一種是經過RestTemplate調用。

SpringCloudConsumerApplication.java以下:

代碼清單:Alibaba/dubbo-spring-cloud-http/spring_cloud_consumer/src/main/java/com/springcloud/spring_cloud_consumer/SpringCloudConsumerApplication.java


@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class SpringCloudConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudConsumerApplication.class, args);
    }

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

使用@EnableFeignClients開啓Feign功能,將RestTemplate以Bean的形式注入Spring中。

1.4 建立子工程dubbo_consumer做爲Dubbo服務的消費方

接口測試類UserController.java以下:

代碼清單:Alibaba/dubbo-spring-cloud-http/dubbo_consumer/src/main/java/com/springcloud/dubbo_consumer/controller/UserController.java


@RestController
public class UserController {

    @Reference(version = "1.0.0")
    UserService userService;

    @PostMapping("/save")
    public UserModel save(@RequestBody UserModel user) {
        return userService.save(user);
    }

    @DeleteMapping("/remove")
    public void remove(@RequestParam("id") Long userId) {
        userService.remove(userId);
    }

    @GetMapping("/findAll")
    public Collection<UserModel> findAll() {
        return userService.findAll();
    }
}

這裏@Reference註解需指明調用服務提供者接口的版本號,若是未指明版本號,將沒法調用咱們前面的服務提供者的接口。

2. 測試

咱們使用測試工具PostMan進行測試,順次啓動三個子工程provider_web、spring_cloud_consumer和dubbo_consumer,首先測試組件Feign訪問,使用PostMan向:http://localhost:8080/saveByFeign 發送 POST 請求,如圖:

測試連接:http://localhost:8080/findAllByFeign ,如圖:

測試 RestTemplate 訪問,如圖:

至此,spring_cloud_consumer測試成功,下面繼續測試dubbo_consumer,如圖:

3. 示例代碼

示例代碼-Github

示例代碼-Gitee

4. 參考

Dubbo Spring Cloud 官方文檔

原文出處:https://www.cnblogs.com/babycomeon/p/11553757.html

相關文章
相關標籤/搜索