上一篇博客記錄了SpringCloud爲我們提供了分佈式一站式的解決方案,其中有個組件Eureka
,它的作用是作爲一個註冊中心,服務提供者可以把服務註冊到它上面,而服務消費者可以通過http協議的restful
風格請求方式去獲取該服務,這一篇博客主要介紹SpringBoot怎麼去整合Eureka
作爲註冊中心。
我們要編寫這種分佈式的應用,那麼就要創建一個空工程,再往裏面添加各種模塊,那麼先創建一個空工程:
這裏我們有一個應用場景,假設有一個買票模塊,它負責提供售票服務,另外有一個用戶模塊。瀏覽器訪問用戶模塊,用戶模塊再去遠程調用售票模塊的服務,之後用戶模塊把結果返回給瀏覽器。大致邏輯就這樣,那我們開動吧。
環境搭建:
這裏需要創建三個模塊,分別是用戶模塊(consumer_user
)、售票模塊(provider_ticket
)還有一個註冊中心(eureka_server
)也是一個模塊。這個要注意了,和之前的Dubbo可不一樣。
Eureka模塊創建時要導入這個依賴(eureka server),這裏就使用Spring initializr來導入了,後續兩個模塊相同:
用戶模塊創建要導入的依賴(由於售票模塊需要導入的依賴也相同,這裏就略過了):
三個項目創建完成之後:
Eureka模塊:
環境弄好之後,先來把Eureka模塊搞定吧。因爲SpringBoot導入了相關依賴,會有自動配置類幫我們自動配置組件,java代碼方面不用我們管,所以我們可以直接去全局配置文件(application.yaml
)中配置即可:
server:
port: 8761
eureka:
instance:
hostname: eureka_server
client:
register-with-eureka: false #不把自己註冊到eureka
fetch-registry: false #不從eureka上獲取服務的具體信息
service-url:
defaultZone: http://localhost:8761/eureka/
這裏解釋一下一些配置
- register-with-eureka: false,目的是不把註冊中心註冊到註冊中心上…(因爲現在我們需求還用不到)
- fetch-registry: false,不獲取服務的具體信息,因爲註冊中心不是服務消費者,所以還不用去獲取具體信息,只管註冊即可。
- service-url.defaultZone: http://localhost:8761/eureka/, 這個屬性是eureka註冊中心的地址,是選配的,如果我們不配的話,它是有一個默認值,默認值是啥也忘記了…
還有一步別忘了,在該模塊的主啓動類上加上@EnableEurekaServer
註解,之後運行主啓動類,訪問localhost:8761/,如果出現以下界面,則代表eureka模塊搞定:
可以看到在界面中有Instances currently registered with Eureka這一欄,這一欄是當前註冊中心有哪些應用,我們目前還沒有。
provider_ticket:
這個模塊就一個ticketService
接口,裏面有一個getTicket()
方法,並在實現類中實現它.同時爲了其他模塊可以遠程調用,需要一個controller層.
ticketService接口:
public interface ticketService {
public String getTicket();
}
實現類ticketServiceImpl:
@Service
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "《我愛你,中國》";
}
}
TicketController:
@RestController
public class TicketController {
@Autowired
private TicketService ticketService;
@GetMapping("/getTicket")
public String getTicket(){
return ticketService.getTicket();
}
}
業務編寫好了,接下來就去配置文件做一些配置:
server:
port: 8001
spring:
application:
name: provider_ticket
eureka:
instance:
prefer-ip-address: true #註冊服務時使用服務的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/
這裏url地址就填我們剛剛eureka
的地址,這樣服務就註冊上去了.
在主啓動類上加上@EnableEurekaClient
註解
我們啓動項目,注意這個過程中剛剛的eureka模塊不能關閉 ,接着訪問local:8761/:
可以看到Instances currently registered with Eureka那一塊已經有provider_ticket
了。
consumer_user:
接下來只剩下服務消費者模塊了。裏面有一個UserService
接口,其中有一個方法buyTicket()
,並在實現類中實現它。爲了測試直觀,也加上controller,這裏代碼略過。
這裏因爲eureka是基於http的resetful風格來管理服務的,所以我們需要一個類RestTemplate
,編寫一個配置類並把它注入到容器中:
@Configuration
public class EurekaConfiguration {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
UserService接口:
public interface UserService {
public String buyTicket();
}
UserServiceImpl實現類:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private RestTemplate restTemplate;
@Override
public String buyTicket() {
String forObject = restTemplate.getForObject("http://localhost:8001/getTicket", String.class);
return "買到票了:"+forObject;
}
}
UserController:
Java代碼部分編寫完成,還是一個套路,編寫全局配置文件中的一些配置:
server:
port: 8002
spring:
application:
name: consumer_user
eureka:
instance:
prefer-ip-address: true #註冊服務時使用服務的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/
我們可以發現這個配置文件和售票模塊的配置文件一樣,也就是說我們也把用戶模塊註冊上去了,那用戶模塊怎麼去調用呢?這就需要在用戶模塊的主啓動類上添加這個註解了@EnableDiscoveryClient
.
之後運行該模塊,訪問localhost:8002/buyTicket 請確保前兩個模塊都開啓!
可以看到遠程調用成功了,並在eureka的Instances currently registered with Eureka中可以看到,有兩個模塊了:
到這裏整合成功了,有關SpringCloud的後續相關知識,我會慢慢整理補齊。不說了,先把服務關掉,風扇一直在轉…