該文章搭建之前需要具備的軟件及工具:
1.一臺雲服務器[我的是阿里雲的centos]
2.雲服務器安裝好JDK[沒安裝的參考這篇:阿里雲服務器安裝JDK]
3.雲服務器安裝好Tomcat[沒安裝的參考這篇:阿里雲服務器安裝Tomcat]
4.zookeeper,dubbo-admin[我用的版本:zookeeper3.4.6,dubbo-admin2.4.1]【文章中貼有下載地址鏈接】
1.搭建zookeeper
- 下載zookeeper,安裝並解壓,此次我用的是:3.4.6,路徑如下
下載地址: zookeeper下載點我
- 複製一份 zoo_sample.cfg 爲 zoo.cfg 如下
- vim zoo.cfg
默認進來之後,會有
Server.1=Master:3333:4444
Server.2=slave1:3333:4444
Server.3=slave2:3333:4444
注意點1:更改成自己服務器的IP,具體幾個server可根據需要添加,由於服務器性能原因,我這裏只保留一個,就是單機模式
注意點2:上面的dataDir dataLogDir 先手動去確認一下,沒有就手動 mkdir
注意點3:沒有myid文件,需要在上圖的:dataDir路徑下生成一個【vi myid就行】,同時寫入上面的server.X中 的 X
【Server.1=Master:3333:4444 就在myid中寫個1
Server.1=Master:3333:4444 Server.2=slave1:3333:4444 就寫1 2 】
【集羣模式下除了多個zookeeper外,在myid文件中也需要添加server.X中的X】
- 修改完之後保存退出,進入bin目錄下,啓動
./zkServer.sh start 啓動指令
./zkServer.sh status 查看啓動狀態的指令
2.搭建dubbo-admin
- 首先下載dubbo-admin的war包,沒有的可以在下面的鏈接進行下載
- 下載完之後,打開找到裏面的dubbo.Properties,需要更改一點點[2181端口對應的zookeeper監聽的端口]
dubbo.registry.address=zookeeper://39.108.173.63:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
- 把紅色區域的IP更換成自己的即可
- 然後把war包放在tomcat的webapps路徑下
- 以上基本就完成了dubbo-admin的相關工作,啓動tomcat即可【啓動有問題的可以看下第四點:常見問題】
啓動完成之後訪問
3.創建Spring項目並訪問
- Spring項目的創建Demo,是可以直接拿來使用的,導入Eclipse之後更改裏面的公網IP即可,對應的代碼下載地址:
- SpringDemo下載,即插即用
使用時候三個項目分別放在三個tomcat
- 先啓動api
- 再啓動provider
- 再啓動consumer
- 再啓動provider中的main
- 再啓動consumer中的main
4.常見問題及解決方案
在搭建過程中,zookeeper搭建沒有遇到問題,遇到也都是可以百度到的,下面針對dubbo啓動的一次錯誤日誌,給出我此次的解決方案:
錯誤日誌:
java.net.UnknownHostException: izwz91b8s2j56kmxiwxcz: izwz91b8s2j56kmxiwxcz
at java.net.InetAddress.getLocalHost(InetAddress.java:1473)
at com.alibaba.dubbo.common.utils.NetUtils.getLocalAddress0(NetUtils.java:203)
at com.alibaba.dubbo.common.utils.NetUtils.getLocalAddress(NetUtils.java:190)
at com.alibaba.dubbo.common.utils.NetUtils.getLocalHost(NetUtils.java:154)
at com.alibaba.dubbo.governance.sync.RegistryServerSync.<clinit>(RegistryServerSync.java:46)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:839)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:671)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:610)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412)
at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:240)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:959)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
at com.alibaba.citrus.webx.context.WebxComponentsLoader.initWebApplicationContext(WebxComponentsLoader.java:117)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5118)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5634)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1092)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1984)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.UnknownHostException: izwz91b8s2j56km66xiwxcz
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293)
at java.net.InetAddress.getLocalHost(InetAddress.java:1469)
... 56 more
WARN utils.ConfigUtils - [DUBBO] No dubbo.properties found on the class path., dubbo version: 2.4.1, current host: 172.19.20.275
錯誤日誌主要看下最後,發現他提到:current host: 172.19.20.275,
而上面又出現一個:UnknownHostException: izwz91b8s2j56kmxiwxcz
前者對應我阿里雲的公網IP,後者對應我的阿里雲實例ID,
我的理解是:他默認映射的是私有IP而非共有IP,所以需要修改host文件,增加一組映射
具體修改方案如下:
vi /etc/hosts
遮擋部分對應自己的實例ID即可
vim /etc/sysconfig/network
修改完之後需要重啓Linux,然後再依次啓動zookeeper,dubbo。就可以出現第三步的效果了