1.springcloud2022ï¼
2.Ribbon负载均衡分析
3.springbootcloud组件
4.Nacos 服务注册源码分析
5.Spring Cloud 五大核心组件解析之Eureka详解
springcloud2022ï¼
å¾®æå¡æ¡æ¶ä¹SpringCloudç®ä»
å¨äºè§£SpringCloudä¹åå äºè§£ä¸ä¸å¾®æå¡æ¶æéè¦èéçæ ¸å¿å ³é®ç¹ï¼å¦ä¸å¾ï¼
对äºä»¥ä¸çæ ¸å¿å ³é®ç¹çå¤çï¼ä¸éè¦æ们éå¤é 车轮ï¼SpringCloudå·²ç»å¸®æ们éæäºï¼å®ä½¿ç¨SpringBooté£æ ¼å°ä¸äºæ¯è¾æççå¾®æå¡æ¡æ¶ç»åèµ·æ¥ï¼å±è½æäºå¤æçé ç½®åå®ç°åçï¼ä¸ºå¿«éæ建微æå¡æ¶æçåºç¨æä¾äºä¸å¥åºç¡è®¾æ½å·¥å ·åå¼åæ¯æã
SpringCloudææä¾çæ ¸å¿åè½å å«ï¼
SpringCloudæ¶æå¾
SpringCloudå项ç®
SpringCloudæä¸çå项ç®å¤§è´å¯ä»¥å为两类ï¼
å¦ä¸ï¼
1.SpringCloudä¸SpringBoot
SpringBootå¯ä»¥è¯´æ¯å¾®æå¡æ¶æçæ ¸å¿ææ¯ä¹ä¸ãéè¿å¨SpringBootåºç¨ä¸æ·»å SpringMVCä¾èµï¼å°±å¯ä»¥å¿«éå®ç°åºäºRESTæ¶æçæå¡æ¥å£ï¼å¹¶ä¸å¯ä»¥æä¾å¯¹HTTPæ åå¨ä½çæ¯æãèä¸SpringBooté»è®¤æä¾JackJsonåºååæ¯æï¼å¯ä»¥è®©æå¡æ¥å£è¾å ¥ãè¾åºæ¯æJSONçãå æ¤ï¼å½ä½¿ç¨SpringCloudè¿è¡å¾®æå¡æ¶æå¼åæ¶ï¼ä½¿ç¨SpringBootæ¯ä¸æ¡å¿ ç»ä¹è·¯ã
2.SpringCloudä¸æå¡æ²»ç(Eureka)
æå¡æ²»çæ¯SpringCloudçæ ¸å¿ï¼å¨å®ç°ä¸å ¶æä¾äºä¸¤ä¸ªéæ©ï¼å³ConsulåNetflixçEurekaã
Eurekaæä¾äºæå¡æ³¨åä¸å¿ãæå¡åç°å®¢æ·ç«¯ï¼ä»¥å注åæå¡çUIçé¢åºç¨ã
å¨Eurekaçå®ç°ä¸ï¼èç¹ä¹é´ç¸äºå¹³çï¼æé¨å注åä¸å¿âææâä¹ä¸ä¼å¯¹æ´ä¸ªåºç¨é æå½±åï¼å³ä½¿é群åªå©ä¸ä¸ªèç¹åæ´»ï¼ä¹å¯ä»¥æ£å¸¸å°æ²»çæå¡ãå³ä½¿æææå¡æ³¨åèç¹é½å®æºï¼Eureka客æ·ç«¯ä¸æç¼åçæå¡å®ä¾å表信æ¯ï¼ä¹å¯è®©æå¡æ¶è´¹è è½å¤æ£å¸¸å·¥ä½ï¼ä»èä¿éå¾®æå¡ä¹é´äºç¸è°ç¨çå¥å£®æ§ååºç¨çå¼¹æ§ã
3.SpringCloudä¸å®¢æ·ç«¯è´è½½åè¡¡(Ribbon)
Ribboné»è®¤ä¸Eureakè¿è¡æ ç¼æ´åï¼å½å®¢æ·ç«¯å¯å¨çæ¶åï¼ä»Eurekaæå¡å¨ä¸è·åä¸ä»½æå¡æ³¨åå表并维æ¤å¨æ¬å°ï¼å½æå¡æ¶è´¹è éè¦è°ç¨æå¡æ¶ï¼Ribbonå°±ä¼æ ¹æ®è´è½½åè¡¡çç¥éæ©ä¸ä¸ªåéçæå¡æä¾è å®ä¾å¹¶è¿è¡è®¿é®ã
SpringCloudéè¿éæNetflixçFeign项ç®ï¼ä¸ºå¼åè æä¾äºå£°æå¼æå¡è°ç¨ï¼ä»èç®åäºå¾®æå¡ä¹é´çè°ç¨å¤çæ¹å¼ã并ä¸é»è®¤Feign项ç®éæäºRibbonï¼ä½¿å¾å£°æå¼è°ç¨ä¹æ¯æ客æ·ç«¯è´è½½åè¡¡åè½ã
4.SpringCloudä¸å¾®æå¡å®¹éãé级(Hystrix)
为äºç»å¾®æå¡æ¶ææä¾æ´å¤§çå¼¹æ§ï¼å¨SpringCloudä¸ï¼éè¿éæNetflixä¸å项ç®Hystrixï¼éè¿ææä¾ç@HystrixCommand注解å¯ä»¥è½»æ¾ä¸ºæ们æå¼åçå¾®æå¡æä¾å®¹éãåéãé级çåè½ãæ¤å¤ï¼Hystrixä¹é»è®¤éæå°Feignå项ç®ä¸ã
Hystrixæ¯æ ¹æ®âæè·¯å¨â模å¼èå建ãå½Hystrixçæ§å°ææå¡åå åçæ éä¹åï¼å°±ä¼è¿å ¥æå¡çæå¤çï¼å¹¶åè°ç¨æ¹è¿åä¸ä¸ªç¬¦åé¢æçæå¡é级å¤çï¼fallbackï¼ï¼èä¸æ¯é¿æ¶é´ççå¾ æè æåºè°ç¨å¼å¸¸ï¼ä»èä¿éæå¡è°ç¨æ¹ç线ç¨ä¸ä¼è¢«é¿æ¶é´ãä¸å¿ è¦å°å ç¨ï¼é¿å æ éå¨åºç¨ä¸çè延é æçéªå´©æåºã
èHystrixç仪表ç项ç®ï¼Dashboardï¼å¯ä»¥çæ§å个æå¡è°ç¨ææ¶èçæ¶é´ã请æ±æ°ãæåççï¼éè¿è¿ç§è¿ä¹å®æ¶ççæ§ååè¦ï¼å¯ä»¥åæ¶åç°ç³»ç»ä¸æ½å¨é®é¢å¹¶è¿è¡å¤çã
5.SpringCloudä¸æå¡ç½å ³(Zuul)
SpringCloudéè¿éæNetflixä¸çZuulå®ç°APIæå¡ç½å ³åè½ï¼æä¾å¯¹è¯·æ±çè·¯ç±åè¿æ»¤ä¸¤ä¸ªåè½
è·¯ç±åè½è´è´£å°å¤é¨è¯·æ±è½¬åå°å ·ä½çå¾®æå¡å®ä¾ä¸ï¼æ¯å®ç°å¤é¨è®¿é®ç»ä¸å ¥å£çåºç¡ã
è¿æ»¤å¨åè½åè´è´£å¯¹è¯·æ±çå¤çè¿ç¨è¿è¡å¹²é¢ï¼æ¯å®ç°è¯·æ±æ ¡éªãæå¡èåçåè½çåºç¡ã
éè¿Zuulï¼å¯ä»¥å°ç»ç²åº¦çæå¡ç»åèµ·æ¥æä¾ä¸ä¸ªç²ç²åº¦çæå¡ï¼ææ请æ±é½å¯¼å ¥ä¸ä¸ªç»ä¸çå ¥å£ï¼å¯¹å¤æ´ä¸ªæå¡åªéè¦æ´é²ä¸ä¸ªAPIæ¥å£ï¼å±è½äºæå¡ç«¯çå®ç°ç»èãéè¿Zuulçåå代çåè½ï¼å¯ä»¥å®ç°è·¯ç±å¯»åï¼å°è¯·æ±è½¬åå°å端çç²ç²åº¦æå¡ä¸ï¼å¹¶åä¸äºéç¨çé»è¾å¤çãæ¤å¤ï¼Zuulé»è®¤ä¼ä¸Eurekaæå¡å¨è¿è¡æ´åï¼èªå¨ä»Eurekaæå¡å¨ä¸è·åææ注åçæå¡å¹¶è¿è¡è·¯ç±æ å°ï¼å®ç°APIæå¡ç½å ³èªå¨é ç½®ã
6.SpringCloudä¸æ¶æ¯ä¸é´ä»¶(Stream)
SpringCloud为ç®ååºäºæ¶æ¯çå¼åï¼æä¾äºStreamå项ç®ï¼éè¿å»ºç«æ¶æ¯åºç¨æ½è±¡å±ï¼æ建äºæ¶æ¯æ¶åãåç»æ¶è´¹åæ¶æ¯åççåè½å¤çï¼å°ä¸å¡åºç¨ä¸çæ¶æ¯æ¶åä¸å ·ä½æ¶æ¯ä¸é´ä»¶è¿è¡è§£è¦ï¼ä½¿å¾®æå¡åºç¨å¼åä¸å¯ä»¥é常æ¹ä¾¿å°ä¸KafkaåRabbitMQçæ¶æ¯ä¸é´ä»¶è¿è¡éæã
SpringCloudBusåºäºStreamè¿è¡æ©å±ï¼å¯ä»¥ä½ä¸ºå¾®æå¡ä¹é´çäºä»¶ãæ¶æ¯æ»çº¿ï¼ç¨äºæå¡é群ä¸ç¶æååçä¼ æã
æ¯å¦SpringCloudConfigåå©Busï¼å¯ä»¥å®ç°é ç½®çå¨æå·æ°å¤çã
7.SpringCloudä¸åå¸å¼é ç½®ä¸å¿(Config)
é对微æå¡æ¶æä¸çé ç½®æ件管çéæ±ï¼SpringCloudæä¾äºä¸ä¸ªConfigå项ç®ãSpringCloudConfigå ·æä¸å¿åãçæ¬æ§å¶ãæ¯æå¨ææ´æ°åè¯è¨ç¬ç«çç¹æ§ã
å¨Configå项ç®ä¸å°å¾®æå¡åºç¨å为两ç§è§è²ï¼é ç½®æå¡å¨ï¼ConfigServerï¼åé 置客æ·ç«¯ï¼ConfigClientï¼ã使ç¨é ç½®æå¡å¨éä¸å°ç®¡çææé ç½®å±æ§æ件ï¼é ç½®æå¡ä¸å¿å¯ä»¥å°é ç½®å±æ§æ件åå¨å°GitãSVNçå ·æçæ¬ç®¡çä»åºä¸ï¼ä¹å¯ä»¥åæ¾å¨æ件系ç»ä¸ãé»è®¤éç¨Gitçæ¹å¼è¿è¡åå¨ï¼å æ¤å¯ä»¥å¾å®¹æå°å¯¹é ç½®æ件è¿è¡ä¿®æ¹ï¼å¹¶å®ç°çæ¬æ§å¶ã
8.SpringCloudä¸å¾®æå¡é¾è·¯è¿½è¸ª(Sleuth)
SpringCloudä¸çSleuthå项ç®ä¸ºå¼åè æä¾äºå¾®æå¡ä¹é´è°ç¨çé¾è·¯è¿½è¸ªã
Sleuthæ ¸å¿ææ³å°±æ¯éè¿ä¸ä¸ªå ¨å±çIDå°åå¸å¨åå¾®æå¡æå¡èç¹ä¸ç请æ±å¤ç串èèµ·æ¥ï¼è¿åäºè°ç¨å ³ç³»ï¼å¹¶åå©æ°æ®åç¹ï¼å®ç°å¯¹å¾®æå¡è°ç¨é¾è·¯ä¸çæ§è½æ°æ®çééã
å æ¤ï¼éè¿Sleuthå¯ä»¥å¾æ¸ æ¥å°äºè§£å°ä¸ä¸ªç¨æ·è¯·æ±ç»è¿äºåªäºæå¡ãæ¯ä¸ªæå¡å¤çè±è´¹äºå¤é¿æ¶é´ï¼ä»èå¯ä»¥å¯¹ç¨æ·ç请æ±è¿è¡åæãæ¤å¤ï¼éè¿å°ééçæ°æ®åéç»Zipkinè¿è¡åå¨ãç»è®¡ååæï¼ä»èå¯ä»¥å®ç°å¯è§åçåæåå±ç¤ºï¼å¸®å©å¼åè 对微æå¡å®æ½ä¼åå¤çã
9.SpringCloudä¸å¾®æå¡å®å ¨(Security)
SpringCloudSecurity为æ们æä¾äºä¸ä¸ªè®¤è¯åé´æçå®å ¨æ¡æ¶ï¼å®ç°äºèµæºææã令ç管ççåè½ï¼åæ¶ç»åZuulå¯ä»¥å°è®¤è¯ä¿¡æ¯å¨å¾®æå¡è°ç¨è¿ç¨ä¸ç´æ¥ä¼ éï¼ç®åäºæ们è¿è¡å®å ¨ç®¡æ§çå¼åã
SpringCloudSecurityé»è®¤æ¯æOAuth2.0认è¯åè®®ï¼å æ¤åç¹ç»å½ä¹å¯ä»¥é常容æå®ç°ï¼å¹¶ä¸OAuth2.0æçæç令çå¯ä»¥ä½¿ç¨JWTçæ¹å¼ï¼è¿ä¸æ¥ç®åäºå¾®æå¡ä¸çå®å ¨ç®¡çã
.SpringCloudçå ¶ä»å项ç®
èªå®ä¹springcloud-gatewayçæå¤ç
ä¸ãåºæ¯
使ç¨springcloudgatewayåï¼æäºçæï¼é®é¢ä¹å°±éä¹èæ¥ï¼æå¡é´è°ç¨æäºhystrixå¯ä»¥åæ¶çæé¤åæ¥å£ãåæå¡çé®é¢ï¼å¯¹ç³»ç»å¾æ帮å©ãä½æ¯ï¼ä¸æ¯ææçæ¥å£é½æ¯æçæ¶é´å å®æçï¼ä¸æ¯ææçæ¥å£é½å¯ä»¥è®¾ç½®ä¸æ ·çè¶ æ¶æ¶é´çï¼
é£ä¹æ们é¢ä¸´ä¸ä¸ªé®é¢ï¼é£å°±æ¯ç¾åä¹çæ¥å£é½å¯ä»¥å¨1så å®ç¾å®æï¼ä½æ¯å°±æ¯é£å 个ç¹æ®æ¥å£ï¼éè¦åå ç§ï¼å åç§ççå¾ æ¶é´ï¼èé»è®¤çæçæ¶é´ååªæä¸ä¸ªã
äºãåæ
å¨åé¢springcloudgatewayæºç 解æä¹è¯·æ±ç¯ä¸æ们ç¥é请æ±ä¼ç»è¿ä¸äºåçè¿æ»¤å¨ï¼GatewayFilterï¼,码解èspringcloudgatewayçé级çæå¤çå°±æ¯ç±ä¸ä¸ªç¹æ®çè¿æ»¤å¨æ¥å¤ççï¼éè¿æºç åææä»¬å ³æ³¨å°HystrixGatewayFilterFactoryè¿ä¸ªç±»ï¼è¿ä¸ªç±»çä½ç¨å°±æ¯ç产GatewayFilterç¨çï¼æ们çä¸å®çå®ç°
å¯ä»¥çå°çº¢æ¡å¤æåæ建äºä¸ä¸ªå¿åçGatewayFilter对象è¿åï¼è¿ä¸ªå¯¹è±¡å¨æ¥å£è¯·æ±è¿ç¨ä¸ä¼è¢«å è½½å°è¿æ»¤å¨é¾æ¡ä¸ï¼ä»ç»çå°è¿éæ¯å建äºä¸ä¸ªRouteHystrixCommandè¿ä¸ªå½ä»¤å¯¹è±¡ï¼æç»è°ç¨command.toObservable()æ¹æ³å¤ç请æ±ï¼å¦æè¶ æ¶çæè°ç¨resumeWithFallbackæ¹æ³
éè¿æºç åægatewayå¨è·¯ç±æ¶å¯ä»¥æå®HystrixCommandKeyï¼å¹¶ä¸å¯¹HystrixCommandKeyè®¾ç½®è¶ æ¶æ¶é´
ä¸ãæ¹æ¡
ç¥éç½å ³çæçåç就好åäº,èªå®ä¹çæçè¿æ»¤å¨é ç½®å°æ¥å£è¯·æ±è¿ç¨ä¸ï¼ç±è¿æ»¤å¨æ¥è¯»åæ¥å£çæé 置并æ建HystrixObservableCommandå¤ç请æ±ã
èªå®ä¹ä¸ä¸ªç±»XXXGatewayFilterFactory继æ¿AbstractGatewayFilterFactoryï¼å°apiå对åºçtimeouté ç½®åï¼æ¥å®ç°ç»åå°å ·ä½æ¥å£ççæé ç½®ï¼å ·ä½å®ç°å¦ä¸ï¼
packageorg.unicorn.framework.gateway.filter;
importcn.hutool.core.collection.CollectionUtil;
importcom.netflix.hystrix.HystrixCommandGroupKey;
importcom.netflix.hystrix.HystrixCommandKey;
importcom.netflix.hystrix.HystrixCommandProperties;
importcom.netflix.hystrix.HystrixObservableCommand;
importcom.netflix.hystrix.exception.HystrixRuntimeException;
importorg.springframework.beans.factory.ObjectProvider;
importorg.springframework.cloud.gateway.filter.GatewayFilter;
importorg.springframework.cloud.gateway.filter.GatewayFilterChain;
importorg.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
importorg.springframework.cloud.gateway.support.ServerWebExchangeUtils;
importorg.springframework.cloud.gateway.support.TimeoutException;
importorg.springframework.core.annotation.AnnotatedElementUtils;
importorg.springframework.mand;
if(CollectionUtil.isNotEmpty(apiTimeoutList)){
//requestå¹é å±äºé£ç§æ¨¡å¼
ApiHystrixTimeoutapiHystrixTimeout=getApiHystrixTimeout(apiTimeoutList,path);
command=newUnicornRouteHystrixCommand(config.getFallbackUri(),exchange,chain,initSetter(apiHystrixTimeout.getApiPattern(),apiHystrixTimeout.getTimeout()));
}else{
command=newUnicornRouteHystrixCommand(config.getFallbackUri(),exchange,chain,initSetter(serviceId(exchange),null));
}
returncommand;
}
/
***@paramapiTimeoutList
*@parampath
*@return
*/
privateApiHystrixTimeoutgetApiHystrixTimeout(ListapiTimeoutList,Stringpath){
for(ApiHystrixTimeoutapiTimeoutPattern:apiTimeoutList){
if(this.antPathMatcher.match(apiTimeoutPattern.getApiPattern(),path)){
returnapiTimeoutPattern;
}
}
ApiHystrixTimeoutapiHystrixTimeout=newApiHystrixTimeout();
apiHystrixTimeout.setApiPattern("default");
apiHystrixTimeout.timeout=null;
returnapiHystrixTimeout;
}
@Override
publicGatewayFilterapply(Configconfig){
return(exchange,chain)-{
UnicornRouteHystrixCommandcommand=initUnicornRouteHystrixCommand(exchange,chain,config);
returnMono.create(s-{
Subscriptionsub=command.toObservable().subscribe(s::success,s::error,s::success);
s.onCancel(sub::unsubscribe);
}).onErrorResume((Function)throwable-{
if(throwableinstanceofHystrixRuntimeException){
HystrixRuntimeExceptione=(HystrixRuntimeException)throwable;
HystrixRuntimeException.FailureTypefailureType=e.getFailureType();
switch(failureType){
caseTIMEOUT:
returnMono.error(newTimeoutException());
caseCOMMAND_EXCEPTION:{
Throwablecause=e.getCause();
if(causeinstanceofResponseStatusException||AnnotatedElementUtils
.findMergedAnnotation(cause.getClass(),ResponseStatus.class)!=null){
returnMono.error(cause);
}
}
default:
break;
}
}
Ribbon负载均衡分析
Ribbon使用介绍
Ribbon的使用非常简单,只需要在配置类中添加相应的码解配置即可。调用时,码解通过服务名在Eureka中注册的码解服务进行调用,Ribbon则自动进行负载均衡。码解以zhao-service-resume项目为例,码解call指令源码开启多个服务实例并打印请求信息,码解即能观察到负载均衡的码解效果。Ribbon默认采用随机负载均衡策略(RandomRule),码解该策略全局生效,码解但可根据需求为不同服务设置不同的码解负载均衡策略。
Ribbon源码解析
自动装配类是码解配置加载的入口,例如LoadBalancerAutoConfiguration类。码解网站源码-驿站源码通过配置,码解LoadBalancerAutoConfiguration会自动注入带有@LoadBalanced注解的码解RestTemplate对象,并注入定制器RestTemplateCustomizer。在定制器代码中,添加了ClientHttpRequestInterceptor拦截器,该拦截器根据请求路径和地址执行负载均衡逻辑。最终,执行负载均衡策略选择服务端进行请求,实现负载均衡。服务列表的获取与更新在RibbonAutoConfigration中的SpringClientFactory和RibbonClientConfiguration类中实现,通过定时任务在ZoneAwareLoadBalancer的父类DynamicServerListLoadBalancer中重新赋值与更新服务列表。
springbootcloud组件
.SpringBoot和SpringCloud的网页源码获取源码关系
很多人新手对于SpringBoot和SpringCloud的关系说不清楚、理解不清楚,本文抽出点时间来进行分享下自己的理解,以帮助大家更好的理解两者之间的关系。
其设计目的之初是用来简化Spring应用的初始搭建以及开发过程。很多东西都是配置好的,约定大于配置,使用注解替代了很多xml臃肿的配置,极大的简化了项目配置的消耗,提供了高效的编程脚手架。
Cloud相当于利用了SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,像是服务注册发现、配置中心、freeeim源码源码时代消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署,SpringCloud并没有重复的造轮子,把各家公司成熟,经得起考验的服务框架组合起来,通过SpringBoot屏蔽调复杂的配置和实现原理,留给开发者一套简单易懂、容易部署、容易维护的电商源码源码分布式开发工具包。
其中的关系是:
Spring-》SpingBoot-》SpringCloud
Cloud的核心组件:
感觉这个话题能写好多的东西,像是SpingCloud和Dubbbo的微服务选型等等再进行对比、比较优缺点,本篇就简单的进行了总结和介绍,希望能帮助到有困惑的朋友吧,后面有时间在写一些文章进行拓展和补充。
SpringCloud微服务体系的组成NetflixEureka是SpringCloud服务注册发现的基础组件
Eureka提供RESTful风格(HTTP协议)的服务注册与发现
Eureka采用C/S架构,SpringCloud内置客户端
启用应用,访问
Eureka客户端开发要点
maven依赖spring-cloud-starter-netflix-eureka-clientapplication.yml
配置eureka.client.service-url.defaultZone
入口类增加@EnableEurekaClient
先启动注册中心,在启动客户端,访问localhost:查看eureka注册中心,看到客户端注册
Eureka名词概念
Register-服务注册,向Eureka进行注册登记
Renew-服务续约,秒/次心跳包健康检查.秒未收到剔除服务
FetchRegistries-获取服务注册列表,获取其他微服务地址
Cancel-服务下线,某个微服务通知注册中心暂停服务
Eviction-服务剔除,秒未续约,从服务注册表进行剔除
Eureka自我保护机制
Eureka在运行期去统计心跳失败率在分钟之内是否低于%
如果低于%,会将这些实例保护起来,让这些实例不会被剔除
关闭自我保护:eureka.服务实例.
enable-self-preservation:false
PS:如非网络特别不稳定,建议关闭
Eureka高可用配置步骤
服务提供者defaultZone指向其他的Eureka
客户端添加所有Eureka服务实例URL
Actuator自动为微服务创建一系列的用于监控的端点
Actuator在SpringBoot自带,SpringCloud进行扩展
pom.xml依赖spring-boot-starter-actuator
RestTemplate+@LoadBalanced显式调用
OpenFeign隐藏微服务间通信细节
Ribbon是RestTemplate与OpenFeign的通信基础
Feign是一个开源声明式WebService客户端,用于简化服务通信
Feign采用“接口+注解”方式开发,屏蔽了网络通信的细节
OpenFeign是SpringCloud对Feign的增强,支持SpringMVC注解
1.新建SpringbootWeb项目,applicationname为product-service
在pom.xml中引入依赖
spring-cloud-starter-alibaba-nacos-discovery作用为向Nacosserver注册服务。
spring-cloud-starter-openfeign作用为实现服务调用。
2.修改application.yml配置文件
3.在启动类上添加@EnableDiscoveryClient、@EnableFeignClients注解
4.编写OrderClientInterface
注:/api/v1/order/test会在下面order-service声明。
OrderClient.java
5.编写Controller和service
ProductController.java
ProductService.java
1.OpenFeign开启通信日志
基于SpringBoot的logback输出,默认debug级别
设置项:feign.client.config.微服务id.loggerLevel
微服务id:default代表全局默认配置
2.通信日志输出格式
NONE:不输出任何通信日志
BASIC:只包含URL、请求方法、状态码、执行时间
HEADERS:在BASIC基础上,额外包含请求与响应头
FULL:包含请求与响应内容最完整的信息
3.OpenFeign日志配置项
LoggerLevel开启通信日志
ConnectionTimeout与ReadTimeout
利用.alibaba.nacos.Nacos,以及如何通过IDEA进行启动和调试。要深入了解Nacos的源码,可以参考nacos.io和github.com/alibaba/nacos...的文档。
Spring Cloud 五大核心组件解析之Eureka详解
Spring Cloud五大核心组件之一的Eureka,作为微服务架构中的服务发现组件,基于Spring Boot开发,集成于Spring Cloud Netflix,专注于服务治理功能。Eureka的基础架构围绕两个关键组件构建:Eureka Server(注册中心服务端)与Eureka Client(注册中心客户端)。
Eureka Server作为服务注册中心,提供注册与发现服务,支持集群部署,以实现高可用性。Service Provider为提供服务的应用实例,包括Spring Boot应用或其他遵循Eureka通信机制的应用。它们将自身提供的服务信息注册至Eureka Server,供Service Consumer(服务消费者)查找。Service Consumer是服务的使用者,通过从注册中心获取服务列表,利用客户端负载均衡算法选择服务提供者,并调用所需服务。
Eureka服务治理机制包含注册、同步、续约、获取、调用和下线等关键流程。服务提供者在启动时向Eureka Server注册,服务注册中心存储服务信息,保证服务可见性。服务同步机制在集群中实现服务信息的共享,确保服务发现的一致性。服务续约机制维持服务的在线状态,防止服务意外剔除。服务消费者通过Eureka Server获取服务列表,并使用Ribbon实现负载均衡调用服务。服务下线机制允许服务提供者在正常关闭时通知Eureka Server,服务注册中心将在一段时间后将服务状态标记为DOWN,并传播信息。失效剔除机制帮助Eureka Server在服务未响应时自动剔除服务实例。为应对网络不稳定情况,Eureka Server具备自我保护机制,限制服务注册表中实例的剔除,以避免误操作。读者可深入源码学习,以更全面地理解Eureka的工作原理。