天天看點

使用Nacos做為SpringCloud和Dubbo的共同注冊中心

【轉載請注明出處】: https://juejin.im/post/5ee250bf5188254323350c83

公司以前的系統都是基于Dubbo的分布式架構,後來的新業務逐漸采用了SpringCloud微服務架構,在互相的業務調用中都是提供http接口供各自調用,但是總感覺很别扭,現在有了阿裡開源的Nacos就可以解決很多問題。最終要實作的效果就是同一個接口,既可以用Dubbo的方式調用,也可以用Feign來調用,覆寫目前的這種場景。

此時服務提供者即注冊了 Dubbo 又注冊了 Http 服務,服務消費者根據配置方式可以在 Dubbo 與 Http 調用中随意切換。

1、接口

nacos-dubbo-cloud-provider-api

接口API做為服務提供者和消費者的共同依賴,将接口不僅暴露為RestAPI,做為Feign的用戶端,也按照Dubbo協定注冊。

依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>           

接口

@FeignClient("nacos-dubbo-cloud-provider-service")
public interface EchoRestDubboService {

    @GetMapping("/echoRestDubbo")
    String echo(@RequestParam String name);
}           

nacos-dubbo-cloud-provider-service

是服務提供者的應用名。

2、服務提供者

nacos-dubbo-cloud-provider-service

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.eyison</groupId>
    <artifactId>nacos-dubbo-cloud-provider-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId
    <version>0.9.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-security</artifactId>
 </dependency>           

EchoRestDubboService

的實作類

@RestController
@Service(version = "1.0.0", protocol = {"dubbo"})
public class EchoRestDubboServiceImpl implements EchoRestDubboService {

    private final Logger logger = LoggerFactory.getLogger(EchoRestDubboServiceImpl.class);

    @Override
    public String echo(String name) {

        logger.info("echo rest dubbo :{}", name);
        return "hello " + name;
    }
}           

WebSecurity

配置

這個必須得配置,否則Dubbo啟動的時候會報EndPoint的錯。

@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/**");
        super.configure(web);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .requestMatchers(EndpointRequest.to("health", "info")).permitAll();
        super.configure(http);
    }
}           

啟動類

NacosDubboCloudProviderApplication

@SpringBootApplication
@EnableDiscoveryClient
public class NacosDubboCloudProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosDubboCloudProviderApplication.class, args);
    }
}           
server:
  port: 8021
spring:
  application:
    name: nacos-dubbo-cloud-provider-service
  main:
      allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
dubbo:
  scan:
    base-packages: com.eyison.service
  protocols:
    dubbo:
      name: dubbo
      port: -1
  registry:
    address: spring-cloud://localhost
feign:
  hystrix:
    enabled: true           

3、服務消費者

nacos-dubbo-cloud-consumer

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.eyison</groupId>
    <artifactId>nacos-dubbo-cloud-provider-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
    <version>0.9.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-security</artifactId>
</dependency>           

WebSecurity

配置類同上,這裡不再重複。

測試類

TestController

@RestController
public class TestController {
  
    @Reference(version = "1.0.0", protocol = "dubbo")
    private EchoRestDubboService echoDubboService;

    @Autowired
    private EchoRestDubboService echoRestService;

    @GetMapping("/echoDubbo")
    String echoDubbo(String name) {
        return echoDubboService.echo(name);
    }

    @GetMapping("/echoRest")
    String echoRest(String name) {
        return echoRestService.echo(name);
    }

}           
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosDubboCloudConsumerApplication {

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

}           
server:
  port: 8011
spring:
  application:
    name: nacos-dubbo-cloud-consumer
  main:
      allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
dubbo:
  application:
    qos:
      port: 33333
  registry:
    address: spring-cloud://localhost
  cloud:
    subscribed-services: nacos-dubbo-cloud-provider-service
logging:
  level:
    org.apache.dubbo: debug
    com.netflix: debug           

依次啟動服務提供者和服務消費者,然後通路消費者的兩個接口可以看到都能成功,而且通過觀察日志,分别是通過Dubbo的RPC和Feign調用的。