springcloud是基于springboot的微服務(wù)管理框架,每一個(gè)springcloud組件都是一個(gè)springboot應(yīng)用
本文記錄eureka服務(wù)端/客戶端的開(kāi)發(fā)流程允蚣,以及使用ribbon對(duì)服務(wù)進(jìn)行調(diào)用。
服務(wù)注冊(cè)于發(fā)現(xiàn)--eureka
springboot版本與springcloud組件版本對(duì)應(yīng)關(guān)系
https://spring.io/projects/spring-cloud ,詳情見(jiàn)springcloud官網(wǎng)。本文使用springboot版本2.2.0,官方推薦springcloud組件版本為Hoxton(倫敦地鐵站名稱)
本文中用到的依賴說(shuō)明
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
#eureka-server依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>Hoxton.M3</version>
</dependency>
#eureka-client依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
#ribbon依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
eureka服務(wù)端配置
- 1.新建springboot項(xiàng)目,導(dǎo)入對(duì)應(yīng)依賴
- 2.@EnableEurekaServer注解嫡意,該注解打在啟動(dòng)類上,標(biāo)注該應(yīng)用為eureka服務(wù)端
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
- application.yml配置
#eureka-server配置
eureka:
client:
registerWithEureka: false #將自己當(dāng)做服務(wù)注冊(cè)捣辆,默認(rèn)true蔬螟,false表示自己只是服務(wù)端,不提供api服務(wù)
fetchRegistry: false #接收注冊(cè)信息汽畴,默認(rèn)true接收其他服務(wù)的注冊(cè)信息
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#eureka實(shí)例名稱
instance:
hostname: eureka-service
:表示是否將自己注冊(cè)到Eureka Server旧巾,默認(rèn)為true。由于當(dāng)前這個(gè)應(yīng)用就是Eureka Server忍些,故而設(shè)為false鲁猩。
:表示是否從Eureka Server獲取注冊(cè)信息,默認(rèn)為true罢坝。因?yàn)檫@是一個(gè)單點(diǎn)的Eureka Server廓握,不需要同步其他的Eureka Server節(jié)點(diǎn)的數(shù)據(jù),故而設(shè)為false
-
3.啟動(dòng)server端服務(wù)嘁酿,訪問(wèn)localhost:8761
暫時(shí)沒(méi)有啟動(dòng)client隙券,因此沒(méi)有發(fā)現(xiàn)服務(wù)
圖片.png
eureka客戶端配置
1.與server端一樣,導(dǎo)入依賴闹司,新建項(xiàng)目
2.@EnableEurekaClient注解
事實(shí)上這個(gè)注解可以不使用娱仔,eureka-client一樣可以注冊(cè)到eureka-server端
@SpringBootApplication
@Slf4j
@EnableEurekaClient //可以不使用
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
log.info("eureka客戶端啟動(dòng)成功");
}
}
- 3.application.yml配置
#客戶端877x開(kāi)頭,方便記錄
server:
port: 8771
#注冊(cè)中心服務(wù)端地址,指向上面eureka-server的 ip+port
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
#應(yīng)用名稱 ,重要游桩,后面調(diào)用服務(wù)牲迫,通過(guò) name + url 方式實(shí)現(xiàn),負(fù)載均衡也需要使用
spring:
application:
name: service-hi
-
4.啟動(dòng)應(yīng)用
圖片.png
圖中Application即為application.yml中對(duì)應(yīng)的應(yīng)用名稱众弓,status描述為服務(wù)提供方的 ip+port
-
5.idea使用技巧
圖片.png
啟動(dòng)后服務(wù)會(huì)啟動(dòng)在端口8771 8772恩溅,如上圖所示隔箍,就不用單獨(dú)去新建一個(gè)client了
至此谓娃,eureka-server,eureka-client均已經(jīng)開(kāi)放完成蜒滩,可以在服務(wù)注冊(cè)中心中看到兩個(gè)服務(wù)提供者已經(jīng)注冊(cè)成功了滨达。eureka-client作為服務(wù)的提供者,已經(jīng)在注冊(cè)中心上注冊(cè)了兩個(gè)服務(wù)俯艰,分別在端口8771/8772捡遍,下面開(kāi)發(fā)服務(wù)消費(fèi)者,以及使用ribbon做負(fù)載均衡竹握,對(duì)服務(wù)進(jìn)行消費(fèi)
消費(fèi)者配置
- 1.新建springboot項(xiàng)目画株,引入eureka依賴
- 2.新增項(xiàng)目基本代碼,啟動(dòng)類使用
注解,注入
用于遠(yuǎn)程調(diào)用
圖片.png - 3.實(shí)現(xiàn)遠(yuǎn)程調(diào)用代碼
@Service
public class DemoServiceImpl implements DemoService {
@Autowired
RestTemplate restTemplate;
@Override
public String hiService(String name) throws UnknownHostException {
//當(dāng)前機(jī)器ip
InetAddress ia = InetAddress.getLocalHost();
System.out.println(ia.getHostAddress());
//遠(yuǎn)程調(diào)用 url
return restTemplate.getForObject("http://localhost:8771/hi?name=" + name, String.class);
}
}
此時(shí)遠(yuǎn)程調(diào)用指定了url谓传,是根據(jù)ip+port發(fā)起的http請(qǐng)求蜈项,并沒(méi)有使用到負(fù)載均衡,下圖可見(jiàn)服務(wù)提供者在eureka注冊(cè)了兩個(gè)服務(wù)续挟,因?yàn)槭莍p+port訪問(wèn)的紧卒,沒(méi)有全部利用上,下面介紹使用ribbon的方式,實(shí)現(xiàn)對(duì)服務(wù)的調(diào)用诗祸,后面會(huì)補(bǔ)充fegin的方式調(diào)用服務(wù)
引入springcloud-ribbon,實(shí)現(xiàn)服務(wù)調(diào)用
ribbon可以進(jìn)入服務(wù)間的調(diào)用跑芳,可以實(shí)現(xiàn)負(fù)載均衡,即對(duì)服務(wù)調(diào)用策略進(jìn)行配置
- 1.引入ribbon依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
- 2.@LoadBalanced注解
@Slf4j
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
log.info("consumer啟動(dòng)成功");
}
@Bean
//使用該注解開(kāi)啟負(fù)載均很直颅,默認(rèn)負(fù)載均很策略為round輪詢策略
@LoadBalanced
RestTemplate restTemplate()
{
return new RestTemplate();
}
}
- 3.更改調(diào)用方式
return restTemplate.getForObject("http://SERVICE-HI/hi?name=" + name, String.class);
這里要將上文提到的url 換成服務(wù)名稱博个,注意服務(wù)名稱要與上文中服務(wù)提供者配置的:application.name 的名稱一致,大小寫(xiě)都可以功偿,或者以eureka服務(wù)列表中的值為準(zhǔn)
#應(yīng)用名稱
spring:
application:
name: service-hi
-
4.啟動(dòng)服務(wù)坡倔,多次調(diào)用測(cè)試赡译,是否為輪詢策略
圖片.png
至此雇盖,ribbon實(shí)現(xiàn)輪詢負(fù)載均衡調(diào)用代碼實(shí)現(xiàn)搓谆,下面簡(jiǎn)單介紹通過(guò)配置文件自定義負(fù)載均衡策略 5.配置文件修改負(fù)載均衡策略
SERVICE-HI:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
SERVICE-HI是eureka中注冊(cè)的服務(wù)名彩倚,需要注意的是惯豆,我一開(kāi)始用的是yml文件中的小寫(xiě)名稱:service-hi蜒什,但是負(fù)載均衡策略沒(méi)有生效管毙,這里原因還不清楚背桐,有知道的大佬可以留言关拒,萬(wàn)分感謝佃蚜。
eureka遇到的一些疑問(wèn)
- 1.服務(wù)注冊(cè)或服務(wù)掛掉后不會(huì)立馬生效
https://www.cnblogs.com/gitveio/p/9207202.html
https://segmentfault.com/a/1190000016909677?utm_source=tag-newest - 2.ribbon調(diào)用服務(wù)超時(shí),延時(shí)1秒也會(huì)包read time out
詳情要參考ribbon設(shè)置的默認(rèn)超時(shí)時(shí)間着绊,后續(xù)加入hystrix時(shí)也會(huì)涉及到超時(shí)問(wèn)題
至此谐算,springcloud 使用eureka+ribbon,進(jìn)行服務(wù)注冊(cè)發(fā)現(xiàn)及調(diào)用已經(jīng)基本實(shí)現(xiàn)归露,這里都是簡(jiǎn)單的demo代碼洲脂,僅以次記錄自己的學(xué)習(xí)過(guò)程,歡迎大家來(lái)交流