您好,登錄后才能下訂單哦!
怎樣使用Spring Cloud搭建服務(wù)注冊(cè)中心,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
與dubbo不同的是,Spring Cloud是一個(gè)一站式分布式框架,Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智能路由,微代理,控制總線)。分布式系統(tǒng)的協(xié)調(diào)導(dǎo)致了樣板模式, 使用Spring Cloud開發(fā)人員可以快速地支持實(shí)現(xiàn)這些模式的服務(wù)和應(yīng)用程序。他們將在任何分布式環(huán)境中運(yùn)行良好,包括開發(fā)人員自己的筆記本電腦,裸機(jī)數(shù)據(jù)中心,以及Cloud Foundry等托管平臺(tái)。那么今天我希望通過一個(gè)簡(jiǎn)單的案例帶小伙伴們來了解下Spring Cloud。
OK,那么本文我主要想介紹下在Spring Cloud中使用Eureka搭建一個(gè)服務(wù)注冊(cè)中心,然后再向其中注冊(cè)服務(wù)。由于Spring Cloud是在Spring Boot的基礎(chǔ)上構(gòu)建分布式服務(wù)的,所以閱讀本文需要有一點(diǎn)Spring Boot的知識(shí)儲(chǔ)備。
OK,那么上面所提到的是閱讀本文所需要具備的基礎(chǔ)知識(shí),在此基礎(chǔ)之上我們來看看怎么樣利用Spring Cloud中的Eureka來搭建服務(wù)注冊(cè)中心。
首先我要說的是Spring Cloud并不是一個(gè)東西,和Hadoop類似,Spring Cloud也包含了許多個(gè)子項(xiàng)目,我們今天要看的Eureka只是其中的一個(gè)子項(xiàng)目,Eureka的功能有點(diǎn)類似于我們之前寫過的zookeeper,它是一個(gè)服務(wù)治理組件,包含了服務(wù)注冊(cè)中心、服務(wù)注冊(cè)與發(fā)現(xiàn)機(jī)制。其他的組件我們這里先不做介紹,后面的系列文章都會(huì)一一提及到。
OK,廢話說了一籮筐,上代碼吧。
首先我們需要?jiǎng)?chuàng)建一個(gè)普通的Spring Boot工程,命名為eureka-server,普通到什么程度呢?就是一個(gè)starter都不需要添加,創(chuàng)建成功之后就只引用了一個(gè)父starter。
工程創(chuàng)建成功之后,向pom.xml文件中添加eureka-server的依賴,目前eureka的穩(wěn)定版本是Dalston.SR3
,添加完依賴之后,pom.xml文件如下所示:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.sang</groupId> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka-server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
那么這里依賴的添加我主要參考了Eureka官網(wǎng)的 http://projects.spring.io/spring-cloud/。
啟動(dòng)一個(gè)服務(wù)注冊(cè)中心的方式很簡(jiǎn)單,就是在Spring Boot的入口類上添加一個(gè)@EnableEurekaServer
注解,如下:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
最后我們?cè)僮鲆稽c(diǎn)簡(jiǎn)單的配置就可以了,配置就寫在Spring Boot的配置文件application.properties中,寫法如下:
server.port=1111 eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
OK,那么關(guān)于這幾行注釋,我說如下幾點(diǎn):
1.server.port=1111表示設(shè)置該服務(wù)注冊(cè)中心的端口號(hào)
2.eureka.instance.hostname=localhost表示設(shè)置該服務(wù)注冊(cè)中心的hostname
3.eureka.client.register-with-eureka=false,由于我們目前創(chuàng)建的應(yīng)用是一個(gè)服務(wù)注冊(cè)中心,而不是普通的應(yīng)用,默認(rèn)情況下,這個(gè)應(yīng)用會(huì)向注冊(cè)中心(也是它自己)注冊(cè)它自己,設(shè)置為false表示禁止這種默認(rèn)行為
4.eureka.client.fetch-registry=false,表示不去檢索其他的服務(wù),因?yàn)榉?wù)注冊(cè)中心本身的職責(zé)就是維護(hù)服務(wù)實(shí)例,它也不需要去檢索其他服務(wù)
OK,做完這一切之后,我們就可以啟動(dòng)這一個(gè)Spring Boot 服務(wù),服務(wù)啟動(dòng)成功之后,在瀏覽器中輸入:http://localhost:1111就能夠看到如下頁面:
OK,看到上面這個(gè)頁面之后,表示你的服務(wù)注冊(cè)中心已經(jīng)搭建好了。
我們之前專門有一篇博客介紹如何在Linux上安裝zookeeper【Linux上安裝Zookeeper以及一些注意事項(xiàng)】,但是對(duì)于Eureka卻不存在這樣的問題,因?yàn)镋ureka中的服務(wù)注冊(cè)中心實(shí)際上是一個(gè)Spring Boot工程,而Spring Boot工程我們知道可以直接打成一個(gè)jar包,然后java -jar命令就可以運(yùn)行,不管Windows還是Linux上,運(yùn)行方式都是一致的。
OK,那么現(xiàn)在服務(wù)注冊(cè)中心有了之后,我們可以考慮向這個(gè)服務(wù)注冊(cè)中心注冊(cè)一個(gè)服務(wù)提供者了。
還是創(chuàng)建一個(gè)Spring Boot工程,這次創(chuàng)建比之前創(chuàng)建多一個(gè)步驟,在創(chuàng)建的時(shí)候選中web的starter,我們來創(chuàng)建一個(gè)web工程,在IntelliJ IDEA中創(chuàng)建的時(shí)候選中web,如下:
在創(chuàng)建好的工程中,我們需要添加Eureka依賴,添加方式如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.sang</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>provider</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
這是一個(gè)web工程,所以我們添加一個(gè)Controller,在該Controller中提供一個(gè)訪問入口,如下:
@RestController public class HelloController { private final Logger logger = Logger.getLogger(getClass()); @Autowired private DiscoveryClient client; @RequestMapping(value = "/hello", method = RequestMethod.GET) public String index() { List<ServiceInstance> instances = client.getInstances("hello-service"); for (int i = 0; i < instances.size(); i++) { logger.info("/hello,host:" + instances.get(i).getHost() + ",service_id:" + instances.get(i).getServiceId()); } return "Hello World"; } }
這里創(chuàng)建服務(wù)之后,在日志中將服務(wù)相關(guān)的信息打印出來。
在Spring Boot的入口函數(shù)處,通過添加@EnableDiscoveryClient注解來激活Eureka中的DiscoveryClient實(shí)現(xiàn)(因?yàn)槲覀冊(cè)贖elloController中注入了DiscoveryClient)。
@EnableDiscoveryClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
最后的最后,我們?cè)赼pplication.properties文件中配置一下服務(wù)名和注冊(cè)中心地址即可,如下:
spring.application.name=hello-service eureka.client.service-url.defaultZone=http://localhost:1111/eureka
這兩行代碼的含義很簡(jiǎn)單,我就不多說了。
做完這一切之后,我們就可以來測(cè)試了,直接運(yùn)行這個(gè)Spring Boot工程,運(yùn)行成功之后,我們刷新剛才的http://localhost:1111,就可以看到有一個(gè)服務(wù)已經(jīng)注冊(cè)成功了。如下:
同時(shí),我們查看這個(gè)服務(wù)提供者運(yùn)行日志,也可以看到服務(wù)的信息,如下:
OK,如此之后,我們一個(gè)服務(wù)注冊(cè)中心就搭建成功了,同時(shí)也有一個(gè)服務(wù)提供者成功的注冊(cè)了。但是這樣還有一個(gè)小問題,那就是我們這里是一個(gè)單節(jié)點(diǎn)的服務(wù)注冊(cè)中心,一旦發(fā)生了故障整個(gè)服務(wù)就癱瘓了,所以在實(shí)際應(yīng)用中,我們需要搭建高可用注冊(cè)中心。
看完上述內(nèi)容,你們掌握怎樣使用Spring Cloud搭建服務(wù)注冊(cè)中心的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。