SpringCloud之Eureka服務治理中心
引用SpringCloud中文官網的一句話:
微服務架構集大成者,雲端計算最佳實踐,搭建分散式、微服務專案的一站式框架
Eureka介紹:
主要用來實現服務的註冊、發現
註冊中心建立:
- 1.建立第一個Springboot專案,作為註冊中心,勾選cloudDescovry的:Eurekaserver
- 2.在啟動類上註解:
@EnableEurekaServer //標記這是註冊中心
- 3.在application.yml中配置:
#埠號
server:
port: 8761
eureka:
instance:
#主機名稱
hostname: localhost
client:
#自身不註冊
registerWithEureka: false
#不發現自身服務
fetchRegistry: false
serviceUrl:
#訪問地址,高可用,支援叢集,多個之間,隔開
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
#服務名稱,強烈建議給每一個服務起個名字,含義為服務,要求不重複,這樣就好區分
name: server1803
注:測試時,一個專案中模擬啟動多個註冊中心,可copy啟動方式(左上角減號右邊按鈕),在環境配置中Vm Options框填寫:
-Dserver.port=8762
在yml的servicelUrl中配置叢集,採用逗號隔開,當然,這裡引用就不能寫相同的埠了。
驗證: http://localhost:8761
服務提供者建立:
- 1、建立第二個springboot專案,作為提供者,勾選cloudDescovry的:Eurekaserver
- 2、在啟動類上註解:
@EnableEurekaClient //標記這是客戶端,提供者
- 3、在application.yml中配置:
#設定埠
server:
port: 9761
#連線資料庫
spring:
datasource:
driver-class-name : com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/sswd?useSSL=false
username: root
password: 123
type: com.alibaba.druid.pool.DruidDataSource
application:
name: provider1803
#註冊中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
因為springcloud的提供者提供的是介面,所以正常的書寫mapper、service、controller的程式碼即可
等下需要在消費端service層配置對映的介面地址
驗證:
點選後邊的地址,得到如下
去掉後邊的actuator/info,在地址後拼接上介面地址:
在實際開發中,都是指定前段域名部分為一個固定名稱(需要配置),通過ip域名等方式訪問,如:
http://kam1996:9691/wordlist.do?flag=1
注意:雖然這是資料介面,返回的是xml格式資料。但請不要直接在消費者中直接訪問此路徑,直接訪問就相當於沒走註冊中心,也就 沒有實現服務的釋出與消費。
消費者建立:
- 1、建立第三個Springboot專案,作為服務消費者勾選cloudDescovry的:Eurekaserver,同時勾選
cloud routing中的ribbon或者feign,任選其一。兩種實現消費者的方式不同,實現方式如下:
ribbon實現:
-
2、在啟動類上註解:
@EnableEurekaClient//客戶端 @EnableDiscoveryClient//發現服務
-
3、在application.yml中配置:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: ribbon1803
server:
port: 10762
- 4、配置類RibbonConfig:
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced //啟用負載均衡
public RestTemplate createTem(){
//交由ioc管理RestTemplate物件
return new RestTemplate();
}
}
- 5、service中,注意是類class不是interface:
@Service
public class HiService {
//注入ioc建立的resttemplate物件,由此物件的方法獲取資料
@Autowired
private RestTemplate restTemplate;
public String hi(){
//get請求通過get開頭的方法,post通過post開頭的方法,根據返回值不同,選擇不同的方法即可
//這裡的請求地址使用http://server-name,來代替http://ip:port,因為在ribbon中它會根據
// 服務名來選擇具體的服務例項,根據服務例項在請求的時候會用具體的url替換掉服務名,這裡請求的是http://provider1803/hello.do
return restTemplate.getForObject("http://PROVIDER1803/hello.do",String.class);
}
}
- 6、controller正常呼叫
- 7、驗證:訪問controller介面即可
feign實現:(推薦)
- 1、在啟動類上註解:
@EnableEurekaClient//標記客戶端
@EnableDiscoveryClient//發現服務
@EnableFeignClients//消費者模板
- 2、在application.yml中配置:
#註冊中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
#服務名稱
name: feign1803
server:
#埠
port: 10761
3、除了service層程式碼與之前有點不同,其他一樣:
@FeignClient(value = "provider1803")
public interface WordService {
@RequestMapping(value = "/wordsave.do",method = RequestMethod.POST)
public R save(@RequestBody Word word);
@RequestMapping(value = "/wordlist.do",method = RequestMethod.GET)
public List<Word> list(@RequestParam(value = "flag") int flag);
}
解釋註解:
@FeignClient(value = “provider1803”):
指明將要消費的服務名稱
@RequestMapping(value = “/wordsave.do”,method = RequestMethod.POST):
指明提供者的controller中,書寫的對應的資料介面,value和method要與提供者一致
方法,而方法的方法名和引數返回值等皆與提供者的方法引數返回值一致。在於物件上加上了@RequestBody 這樣消費者才能訪問到提供者介面。即兩者之間是json格式傳輸的
@RequestParam(value = “flag”):
指定引數
4、Controller層
這裡要提到@ResponseBody 註解,此 讓我們的控制器不在呼叫viewresolve,而只是一個標記。至於消費介面返回的資料還是xml,我們可以在mapping註解里加上引數:
produces = "application/json"
即可返回 json 格式的資料