原文鏈接:https://blog.csdn.net/weixin_40533111/article/details/83658248 作者四月天五月雨^_^,轉載請註明出處,謝謝
聲明
本文參考dubbo官網:http://dubbo.apache.org/en-us/docs/user/preface/architecture.html
基礎架構,理論篇可參考:dubbo使用小全 分析 理解 附GitHub 源碼 ( 一 )
其他重要功能可參考:dubbo使用小全 分析 理解 附GitHub 源碼 ( 三 )
1.搭建簡單工程:
在springboot大行其道的今天,本文用純註解方式使用dubbo,註冊中心可用zookeeper,redis等需要單獨搭建,本文采用multicast廣播方式,可用於測試,生產上建議zookeeper
1.依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.4</version>
</dependency>
<!--補充dubbo依賴的netty包-->
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.1.2</version>
</dependency>
2.provider
2.1 服務提供方配置信息,以後的各種使用,基本都在此處
/**
* @author peichanglei
* @date 2018/11/02 12:16
*/
@Configuration
public class DubboProviderConfig {
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("provider-test");
return applicationConfig;
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("multicast://224.5.6.7:1234");
registryConfig.setClient("curator");
return registryConfig;
}
@Bean
public ProviderConfig providerConfig() {
ProviderConfig providerConfig = new ProviderConfig();
/**
* 集羣容錯模式,設置重試次數(不含第一次)
*/
providerConfig.setRetries(2);
return providerConfig;
}
}
2.2.具體提供的服務,真實的項目中需單獨打包此接口,讓提供,消費雙方方使用
2.3 application啓動類上加暴露服務掃描
@SpringBootApplication
@DubboComponentScan(basePackages = "com.lei.record.service.impl")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.4實現服務,對外暴露
import com.alibaba.dubbo.config.annotation.Service;
import com.lei.record.service.UserService;
/**
* @author peichanglei
* @date 2018/11/02 2:00
*/
@Service(timeout = 3000)
public class UserServiceImpl implements UserService {
@Override
public String getUser(Long id) {
return "provider user " + id;
}
}
注意:此處使用dubbo的Service註解暴露,不能是spring的
3.consumer
3.1服務提供方配置信息,以後的各種使用,基本都在此處
@Configuration
public class DubboConfiguration {
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("consumer-test1");
//經典錯誤導致:dubbo的qos默認端口爲22222,區別於應用端口和dubbo服務端口,如果在一臺機器上啓動超過1個dubbo服務,就會衝突,不管是provider還是consumer
applicationConfig.setQosPort(22223);
return applicationConfig;
}
@Bean
public ConsumerConfig consumerConfig() {
ConsumerConfig consumerConfig = new ConsumerConfig();
consumerConfig.setTimeout(3000);
//啓動時檢查,默認爲true,當服務不可用或多個應用存在循環依賴,需關閉檢測,以防啓動失敗,若後面時間中,服務恢復,dubbo的心跳檢查會自動連上
consumerConfig.setCheck(false);
return consumerConfig;
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("multicast://224.5.6.7:1234");
registryConfig.setClient("curator");
return registryConfig;
}
}
3.2 引入定義好的接口jar包,不在贅述
3.3 application啓動類上加引用服務包的掃描
@SpringBootApplication
@DubboComponentScan(basePackages = "com.lei.record.service")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.4服務消費
@Controller
public class User {
@Reference
private UserService userService;
@RequestMapping(value = "getName", method = {RequestMethod.GET}, produces = "application/json")
@ResponseBody
public String getName() {
String result;
if (userService != null) {
String user = userService.getUser(12L);
System.out.println("調用成功------" + user);
result = "調用成功------" + user;
} else {
System.out.println("調用失敗------");
result = "調用失敗------";
}
return result;
}
}
import com.alibaba.dubbo.config.annotation.Reference註解可注入可使用的服務
4,至此,一個基於dubbo的生產消費架構搭建完成
頁面訪問顯示調用成功
以上爲簡單調用,更多的配置信息科參考下篇.
5.遇到的問題
1.provider正常啓動了,當consumer啓動時,端口被佔用:錯誤復現如下:
2018-11-02 17:09:50.253 INFO 68880 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-11-02 17:09:50.253 INFO 68880 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2018-11-02 17:09:50.795 ERROR 68880 --- [ main] com.alibaba.dubbo.qos.server.Server : [DUBBO] qos-server can not bind localhost:22222, dubbo version: 2.6.2, current host: 192.168.244.1
java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_171]
at sun.nio.ch.Net.bind(Net.java:433) ~[na:1.8.0_171]
at sun.nio.ch.Net.bind(Net.java:425) ~[na:1.8.0_171]
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[na:1.8.0_171]
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:130) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:558) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1358) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:501) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:486) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:1019) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:254) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:366) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446) ~[netty-transport-4.1.29.Final.jar:4.1.29.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.29.Final.jar:4.1.29.Final]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_171]
乍一看錯誤爲端口被佔,條件反射就工程的接口和dubbo服務的接口,更改後發現問題依舊,花了好一會才發現是dubbo的qos端口被佔
,這也是個人的思維死角,只看到了明顯的現象,以爲就是原因,沒有繼續向上翻,耗費了點時間,這裏算是給自己的成長,以後再排除問題就的先仔細閱讀堆棧信息,定位真實有用的信息後,再解決.
去配置中心,改掉即可