詳解springcloud之服務(wù)注冊(cè)與發(fā)現(xiàn)
本次分享的是關(guān)于springcloud服務(wù)注冊(cè)與發(fā)現(xiàn)的內(nèi)容,將通過(guò)分別搭建服務(wù)中心,服務(wù)注冊(cè),服務(wù)發(fā)現(xiàn)來(lái)說(shuō)明;現(xiàn)在北京這邊很多創(chuàng)業(yè)公司都開(kāi)始往springcloud靠了,可能是由于文檔和組件比較豐富的原因吧,畢竟是一款目前來(lái)說(shuō)比較完善的微服務(wù)架構(gòu);本次分享希望能給大家?guī)?lái)好的幫助;
- Eureka服務(wù)中心
- Provider注冊(cè)服務(wù)
- Consumer發(fā)現(xiàn)服務(wù)
- Eureka服務(wù)中心高可用
Eureka服務(wù)中心
就我現(xiàn)在了解到并且用的比較多的注冊(cè)中心有zookeeper和Eureka,我的上上篇文章分享了dubbo+zookeeper來(lái)構(gòu)建服務(wù),因此本次用的是Eureka,springcloud框架也是推薦它來(lái)作為注冊(cè)中心,當(dāng)然可以集成其他的服注冊(cè)中心,畢竟springcloud依賴于springboot來(lái)構(gòu)建項(xiàng)目的,因此集成其他組件是很快的;首先創(chuàng)建注冊(cè)中心項(xiàng)目 eureka_server ,通過(guò)如下引入依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
然后在application.yml文件中增加配置項(xiàng):
server:
port: 2001
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: false #禁止自己當(dāng)做服務(wù)注冊(cè)
fetch-registry: false #屏蔽注冊(cè)信息
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
配置完成后,還需要再啟動(dòng)類增加注解 @EnableEurekaServer ,設(shè)置基本完成即可運(yùn)行,訪問(wèn) http: // localhost:2001/ 得到如下界面:

Provider注冊(cè)服務(wù)
有了服務(wù)注冊(cè)中心,我們還需要提供一些服務(wù)并且把這些服務(wù)注冊(cè)到服務(wù)中心去,這里為了方便先創(chuàng)建一個(gè)服務(wù)提供者和消費(fèi)者共同使用的接口模塊項(xiàng)目 eureka_api ,并創(chuàng)建如下接口和請(qǐng)求返回參數(shù)實(shí)體類:
public interface UserInterface {
@PostMapping("/users")
MoRp<List<MoUser>> getUsers(MoRq rq);
@GetMapping("/msg")
String getMsg();
}
MoUser實(shí)體:
public class MoUser {
private long id;
private String userName;
private String userPwd;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
然后創(chuàng)建我們的服務(wù)提供端的模塊 eureka_provider ,同樣引入eureka依賴不過(guò)和server端有點(diǎn)區(qū)別:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
再來(lái)創(chuàng)建服務(wù)提供端要提供的服務(wù)UserController,并且實(shí)現(xiàn)我們eureka_api模塊中的UserInterface接口,代碼如下:
@RestController
public class UserController implements UserInterface {
@Autowired
private HttpServletRequest request;
@Override
public MoRp<List<MoUser>> getUsers(MoRq rq) {
MoRp<List<MoUser>> rp = new MoRp<>();
List<MoUser> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
MoUser moUser = new MoUser();
moUser.setId(i);
moUser.setUserName("神牛" + i);
list.add(moUser);
}
rp.setT(list);
rp.setStatus(list.size() >= 1 ? 1 : 0);
rp.setMessage(list.size() >= 1 ? "" : "暫無(wú)數(shù)據(jù)");
return rp;
}
@Override
public String getMsg() {
return "這里是provider,端口:"+ request.getServerPort();
}
}
這里需要注意的是Controller的兩個(gè)服務(wù)接口中沒(méi)有再加PostMapping或GetMapping,因?yàn)檫@個(gè)由被實(shí)現(xiàn)接口申明了;定義好了users和msg服務(wù)后,我們還需要能把他們注入到服務(wù)注冊(cè)中心去,因此需要如下application.yml的配置:
spring:
application:
name: eureka-provider #服務(wù)名稱
eureka:
client:
service-url:
defaultZone: http://localhost:2001/eureka/ #服務(wù)中心地址
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
server:
port: 2004
我們還需要在啟動(dòng)類增加如下標(biāo)記 @EnableEurekaClient ,它表示啟動(dòng)eureka客戶端,因?yàn)榉?wù)提供者相對(duì)服務(wù)中心來(lái)說(shuō)是屬于客戶端的存在;當(dāng)運(yùn)行eureka_provider項(xiàng)目的時(shí)候,我們?cè)谧?cè)中心能看到如下信息:

為了保證服務(wù)提供端接口沒(méi)問(wèn)題,我們可以直接點(diǎn)擊eureka-provider:2004,然后增加要方法接口的路徑我這里是:http://192.168.153.148:2004/msg,即可得到如下正常訪問(wèn)接口返回的信息:

Consumer發(fā)現(xiàn)服務(wù)
有了接口服務(wù),我們還需要消費(fèi)服務(wù),因此創(chuàng)建module項(xiàng)目eureka_consumer,因?yàn)檫@里采用fegin偽客戶端的方式來(lái)訪問(wèn)我們服務(wù)提供端,并且同樣需要引入eureka的依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
然后在service層定義UserService服務(wù)并且實(shí)現(xiàn)公共接口模塊 eureka_api 中的接口,代碼如:
@FeignClient(value = "eureka-provider")
public interface UserService extends UserInterface {
}
通過(guò)FeignClient來(lái)指定調(diào)用的服務(wù)端應(yīng)用名稱eureka-provider,這名稱對(duì)應(yīng)注冊(cè)在服務(wù)中心的Application目錄下 ,在Controller層創(chuàng)建一個(gè)響應(yīng)的輸出UserController并分別提供兩個(gè)展示的接口,代碼如:
@RestController
public class UserController{
@Autowired
private UserService userService;
@GetMapping("/users")
public MoRp<List<MoUser>> getUsers(MoRq rq) {
return userService.getUsers(rq);
}
@GetMapping("/msg")
public String getMsg() {
return userService.getMsg();
}
}
同樣Consumer端也需要在application.yml中配置一些信息:
spring:
application:
name: eureka-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:2001/eureka/ #注冊(cè)中心地址
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
server:
port: 2005
配置基本和provider端差不多,最后需要在啟動(dòng)類申明如下注解:
@SpringBootApplication
@EnableDiscoveryClient //消費(fèi)者客戶端
@EnableFeignClients //feign客戶端
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class, args);
}
}
啟動(dòng)eureka_consumer項(xiàng)目后,我們能在注冊(cè)中心看到它注冊(cè)進(jìn)來(lái)的信息:

然后通過(guò)訪問(wèn)eureka_consumer消費(fèi)方的接口測(cè)試eureka_provider服務(wù)提供方的接口數(shù)據(jù)知否能正常響應(yīng),接口地址 http: // 192.168.153.148:2005/msg :

通過(guò)訪問(wèn)consumer得到了provider的結(jié)果,這就是服務(wù)注冊(cè)和發(fā)現(xiàn)的基本測(cè)試流程;至于消費(fèi)方怎么請(qǐng)求到提供方接口的,我們通過(guò)如下手工圖可解:

Eureka服務(wù)中心高可用
由上面手工圖來(lái)看,服務(wù)中心承擔(dān)著很重要的角色,通常這種服務(wù)中心不僅僅只搭建一個(gè),因此需要搭建一套高可用的服務(wù)中心出來(lái);其實(shí)很簡(jiǎn)單provider和consumer配置都不用動(dòng),我們只需要在第一節(jié)點(diǎn)的eureka-server項(xiàng)目的application.yml中配置下并且在多啟動(dòng)幾個(gè)不同端口的服務(wù)就行了(同一臺(tái)服務(wù)器是多個(gè)端口,不同服務(wù)器端口可能是一樣的):
server:
port: 2001
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: true #配置高可用的時(shí)候需要開(kāi)放自己注冊(cè)自己
fetch-registry: true
service-url:
defaultZone: http://localhost:2002/eureka/ #注冊(cè)到端口2002的eureka中
# defaultZone: http://localhost:2001/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
server:
eviction-interval-timer-in-ms: 2000 #剔除失效服務(wù)間隔
高可用配置需要注意以下幾點(diǎn):
- register-with-eureka: true 配置高可用的時(shí)候需要開(kāi)放自己注冊(cè)自己,便于多個(gè)eureka注冊(cè)中心互通
- defaultZone:http://localhost:2002/eureka/ 每個(gè)注冊(cè)中心都需要吧自己注冊(cè)到別的注冊(cè)中心去
這里我創(chuàng)建了兩個(gè)注冊(cè)中心地址分別為:http://localhost:2001/,http://localhost:2002/;由于之前provider和consumer配置的注冊(cè)中心地址都是2001端口的,為了驗(yàn)證高可用我們需要訪問(wèn)2002端口注冊(cè)中心,效果如:

能夠看到2002端口有著2001端口同樣的注冊(cè)信息,當(dāng)我關(guān)閉2001端口的應(yīng)用時(shí),2002還是能夠查到provider和consumer的信息,更詳細(xì)的配置可以參照官網(wǎng)說(shuō)明。
git地址: https://github.com/shenniubuxing3
nuget 發(fā)布包:https://www.nuget.org/profiles/shenniubuxing3
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java將word文件轉(zhuǎn)成pdf文件的操作方法
這篇文章主要介紹了Java將word文件轉(zhuǎn)成pdf文件的操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
基于Java實(shí)現(xiàn)簡(jiǎn)易的七星彩號(hào)碼生成器
七星彩是中國(guó)體育彩票的一種玩法,由中國(guó)國(guó)家體育總局體育彩票管理中心統(tǒng)一發(fā)行。本文為大家準(zhǔn)備了一個(gè)七星彩號(hào)碼生成器Java工具類,感興趣的可以了解一下2022-08-08
Spring-AOP @AspectJ進(jìn)階之如何綁定代理對(duì)象
這篇文章主要介紹了Spring-AOP @AspectJ進(jìn)階之如何綁定代理對(duì)象的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
slf4j?jcl?jul?log4j1?log4j2?logback各組件系統(tǒng)日志切換
這篇文章主要介紹了slf4j、jcl、jul、log4j1、log4j2、logback的大總結(jié),各個(gè)組件的jar包以及目前系統(tǒng)日志需要切換實(shí)現(xiàn)方式的方法,有需要的朋友可以借鑒參考下2022-03-03
JAVA中使用雙括號(hào)來(lái)初始化靜態(tài)常量的小技巧
這篇文章主要介紹了JAVA中使用雙括號(hào)來(lái)初始化靜態(tài)常量的小技巧,需要的朋友可以參考下2014-06-06
Java 覆蓋equals時(shí)總要覆蓋hashcode
這篇文章主要介紹了Java 覆蓋equals時(shí)總要覆蓋hashcode的相關(guān)資料,這里附有實(shí)例代碼,具有參考價(jià)值,需要的朋友可以參考下2016-12-12

