【轉載請注明出處】: https://juejin.im/post/5ee250bf5188254323350c83
公司以前的系統都是基于Dubbo的分布式架構,後來的新業務逐漸采用了SpringCloud微服務架構,在互相的業務調用中都是提供http接口供各自調用,但是總感覺很别扭,現在有了阿裡開源的Nacos就可以解決很多問題。最終要實作的效果就是同一個接口,既可以用Dubbo的方式調用,也可以用Feign來調用,覆寫目前的這種場景。
此時服務提供者即注冊了 Dubbo 又注冊了 Http 服務,服務消費者根據配置方式可以在 Dubbo 與 Http 調用中随意切換。
1、接口 nacos-dubbo-cloud-provider-api
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
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
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調用的。