SpringCloud學(xué)習(xí)04--服務(wù)消費(fèi)Ribbon和Feign
Ribbon
Ribbon 是一個(gè)基于HTTP和TCP客戶(hù)端的負(fù)載均衡器,F(xiàn)eign中也使用了Ribbon,后面會(huì)介紹Feign的使用。
它可以在客戶(hù)端配置ribbonServerList(服務(wù)端列表),然后輪詢(xún)請(qǐng)求以實(shí)現(xiàn)均衡負(fù)載。
它在聯(lián)合Eureka使用時(shí)ribbonServerList會(huì)被DiscoveryEnabledNIWSServerList重寫(xiě),擴(kuò)展成從Eureka注冊(cè)中心獲取服務(wù)端列表同時(shí)它也會(huì)用NIWSDiscoveryPing來(lái)取代IPing,它將職責(zé)委托給Eureka來(lái)確定服務(wù)端是否已經(jīng)啟動(dòng)。
Feign
Spring Cloud Netflix的微服務(wù)都是以HTTP接口的形式暴露的,所以可以用Apache的HttpClient或Spring的RestTemplate去調(diào)用。
而Feign是一個(gè)聲明式的Web Service客戶(hù)端,它使得編寫(xiě)Web Serivce客戶(hù)端變得更加簡(jiǎn)單。我們只需要使用Feign來(lái)創(chuàng)建一個(gè)接口并用注解來(lái)配置它既可完成。它具備可插拔的注解支持,包括Feign注解和JAX-RS注解。Feign也支持可插拔的編碼器和解碼器。Spring Cloud為Feign增加了對(duì)Spring MVC注解的支持,還整合了Ribbon和Eureka來(lái)提供均衡負(fù)載的HTTP客戶(hù)端實(shí)現(xiàn)。
是一個(gè)使用起來(lái)更加方便的Http客戶(hù)端,它用起來(lái)就像調(diào)用本地方法一樣,完全感覺(jué)不到是調(diào)用的遠(yuǎn)程方法。
總結(jié)起來(lái)就是:發(fā)布到注冊(cè)中心的服務(wù)方接口,是Http的,也可以不用Ribbon或Feign,直接在瀏覽器一樣能夠訪問(wèn)。
只不過(guò)Ribbon或Feign調(diào)用起來(lái)要方便一些,最重要的是它倆都支持軟負(fù)載均衡。
注意:spring-cloud-starter-feign里面已經(jīng)包含了spring-cloud-starter-ribbon
(Feign中也使用了Ribbon)
示例代碼
示例代碼如下(也可以直接從
Github下載:
https://github.com/v5java/demo-cloud-05-ribbon-feign)
它是由五個(gè)模塊組成的Maven工程,其中包含一個(gè)注冊(cè)中心、兩個(gè)服務(wù)提供者、兩個(gè)服務(wù)消費(fèi)者(分別由Ribbon和Feign實(shí)現(xiàn))
首先啟動(dòng)服務(wù)注冊(cè)中心

部分日志如下:
. ____ _ __ _ _
/\ / _' __ _ () __ __ _ \ \ \ \
( ( )___ | '_ | '| | ' / _` | \ \ \ \
\/ _)| |)| | | | | || (| | ) ) ) )
' |____| .|| ||| |__, | / / / /
=========||==============|/=///_/
:: Spring Boot :: (v1.5.3.RELEASE)
[20170526094201944][main][SpringApplication.logStartupProfileInfo]No active profile set, falling back to default profiles: default
[20170526094204189][main][ConfigurationClassPostProcessor.enhanceConfigurationClasses]Cannot enhance @Configuration bean definition 'refreshScope' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.
[20170526094207978][localhost-startStop-1][WebApplicationImpl._initiate]Initiating Jersey application, version 'Jersey: 1.19.1 03/11/2016 02:08 PM'
[20170526094208101][localhost-startStop-1][DiscoveryJerseyProvider.<init>]Using JSON encoding codec LegacyJacksonJson
[20170526094208102][localhost-startStop-1][DiscoveryJerseyProvider.<init>]Using JSON decoding codec LegacyJacksonJson
[20170526094208319][localhost-startStop-1][DiscoveryJerseyProvider.<init>]Using XML encoding codec XStreamXml
[20170526094208319][localhost-startStop-1][DiscoveryJerseyProvider.<init>]Using XML decoding codec XStreamXml
[20170526094212974][main][ArchaiusAutoConfiguration.configureArchaius]No spring.application.name found, defaulting to 'application'
[20170526094212983][main][URLConfigurationSource.<init>]No URLs will be polled as dynamic configuration sources.
[20170526094212983][main][URLConfigurationSource.<init>]To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
[20170526094213003][main][URLConfigurationSource.<init>]No URLs will be polled as dynamic configuration sources.
[20170526094213003][main][URLConfigurationSource.<init>]To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
[20170526094213252][main][DiscoveryClient.<init>]Client configured to neither register nor query for data.
[20170526094213288][main][DiscoveryClient.<init>]Discovery Client initialized at timestamp 1495762933287 with initial instances count: 0
[20170526094213487][main][DefaultEurekaServerContext.initialize]Initializing ...
[20170526094213491][main][PeerEurekaNodes.updatePeerEurekaNodes]Adding new peer nodes [http://127.0.0.1:1100/eureka/]
[20170526094214466][main][DiscoveryJerseyProvider.<init>]Using JSON encoding codec LegacyJacksonJson
[20170526094214467][main][DiscoveryJerseyProvider.<init>]Using JSON decoding codec LegacyJacksonJson
[20170526094214467][main][DiscoveryJerseyProvider.<init>]Using XML encoding codec XStreamXml
[20170526094214468][main][DiscoveryJerseyProvider.<init>]Using XML decoding codec XStreamXml
[20170526094214786][main][PeerEurekaNodes.start]Replica node URL: http://127.0.0.1:1100/eureka/
[20170526094214803][main][AbstractInstanceRegistry.initRemoteRegionRegistry]Finished initializing remote region registries. All known remote regions: []
[20170526094214804][main][DefaultEurekaServerContext.initialize]Initialized
[20170526094215684][Thread-11][PeerAwareInstanceRegistryImpl.openForTraffic]Got 1 instances from neighboring DS node
[20170526094215685][Thread-11][PeerAwareInstanceRegistryImpl.openForTraffic]Renew threshold is: 1
[20170526094215685][Thread-11][PeerAwareInstanceRegistryImpl.openForTraffic]Changing status to UP
[20170526094215879][main][StartupInfoLogger.logStarted]Started ServiceDiscoveryBootStrap in 17.0 seconds (JVM running for 21.803)
[20170526094216690][Eureka-EvictionTimer][AbstractInstanceRegistry$EvictionTask.run]Running the evict task with compensationTime 0ms
[20170526094217690][Eureka-EvictionTimer][AbstractInstanceRegistry$EvictionTask.run]Running the evict task with compensationTime 0ms
訪問(wèn)
locahost:1100

啟動(dòng)服務(wù)提供方ServiceServer01

部分日志如下
:
. ____ _ __ _ _
/\ / _' __ _ () __ __ _ \ \ \ \
( ( )___ | '_ | '| | ' / _` | \ \ \ \
\/ _)| |)| | | | | || (| | ) ) ) )
' |____| .|| ||| |__, | / / / /
=========||==============|/=///_/
:: Spring Boot :: (v1.5.3.RELEASE)
[20170526100135254][main][SpringApplication.logStartupProfileInfo]No active profile set, falling back to default profiles: default
[20170526100137018][main][ConfigurationClassPostProcessor.enhanceConfigurationClasses]Cannot enhance @Configuration bean definition 'refreshScope' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.
[20170526100145271][main][URLConfigurationSource.<init>]No URLs will be polled as dynamic configuration sources.
[20170526100145277][main][URLConfigurationSource.<init>]To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
[20170526100145306][main][URLConfigurationSource.<init>]No URLs will be polled as dynamic configuration sources.
[20170526100145306][main][URLConfigurationSource.<init>]To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
[20170526100148026][main][DiscoveryJerseyProvider.<init>]Using JSON encoding codec LegacyJacksonJson
[20170526100148035][main][DiscoveryJerseyProvider.<init>]Using JSON decoding codec LegacyJacksonJson
[20170526100148322][main][DiscoveryJerseyProvider.<init>]Using XML encoding codec XStreamXml
[20170526100148322][main][DiscoveryJerseyProvider.<init>]Using XML decoding codec XStreamXml
[20170526100148848][main][ConfigClusterResolver.getClusterEndpoints]Resolving eureka endpoints via configuration
[20170526100149174][main][DiscoveryClient.fetchRegistry]Disable delta property : false
[20170526100149174][main][DiscoveryClient.fetchRegistry]Single vip registry refresh property : null
[20170526100149177][main][DiscoveryClient.fetchRegistry]Force full registry fetch : false
[20170526100149177][main][DiscoveryClient.fetchRegistry]Application is null : false
[20170526100149177][main][DiscoveryClient.fetchRegistry]Registered Applications size is zero : true
[20170526100149178][main][DiscoveryClient.fetchRegistry]Application version is -1: true
[20170526100149178][main][DiscoveryClient.getAndStoreFullRegistry]Getting all instance registry info from the eureka server
[20170526100149668][main][DiscoveryClient.getAndStoreFullRegistry]The response status is 200
[20170526100149670][main][DiscoveryClient.initScheduledTasks]Starting heartbeat executor: renew interval is: 5
[20170526100149678][main][InstanceInfoReplicator.<init>]InstanceInfoReplicator onDemand update allowed rate per min is 4
[20170526100149684][main][DiscoveryClient.<init>]Discovery Client initialized at timestamp 1495764109684 with initial instances count: 0
[20170526100149798][main][DiscoveryClient$3.notify]Saw local status change event StatusChangeEvent [timestamp=1495764109798, current=UP, previous=STARTING]
[20170526100149823][DiscoveryClient-InstanceInfoReplicator-0][DiscoveryClient.register]DiscoveryClient_CALCULATORSERVER/CalculatorServer:2100: registering service...
[20170526100150570][main][StartupInfoLogger.logStarted]Started ServiceServer01BootStarp in 19.56 seconds (JVM running for 21.528)
[20170526100150593][DiscoveryClient-InstanceInfoReplicator-0][DiscoveryClient.register]DiscoveryClient_CALCULATORSERVER/CalculatorServer:2100 - registration status: 204
[20170526100219672][DiscoveryClient-CacheRefreshExecutor-0][DiscoveryClient.fetchRegistry]Disable delta property : false
刷新localhost:1100,發(fā)現(xiàn)多了一個(gè)服務(wù):

訪問(wèn)
http://127.0.0.1:2100/add?a=10&b=5

連續(xù)訪問(wèn)三次:
http://127.0.0.1:2100/add?a=10&b=5
日志如下:
[20170526101149185][AsyncResolver-bootstrap-executor-0][ConfigClusterResolver.getClusterEndpoints]Resolving eureka endpoints via configuration
[20170526101445340][http-nio-2100-exec-1][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=15
[20170526101454636][http-nio-2100-exec-10][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=15
[20170526101506163][http-nio-2100-exec-9][CalculatorController.add]uri=http://172.25.126.162:2100,serviceId=CalculatorServer,result=15
啟動(dòng)服務(wù)提供方ServiceServer02
刷新
localhost:1100,發(fā)現(xiàn)注冊(cè)的服務(wù)有兩個(gè)

訪問(wèn)
127.0.0.1:2200/add?a=10&b=10

連續(xù)訪問(wèn)兩次
127.0.0.1:2200/add?a=10&b=10
日志如下:
[20170526101632306][http-nio-2200-exec-3][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=20
[20170526101641271][http-nio-2200-exec-2][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=20
啟動(dòng)服務(wù)消費(fèi)端ServiceClient01(Ribbon)
部分日志如下
:
. ____ _ __ _ _
/\ / _' __ _ () __ __ _ \ \ \ \
( ( )___ | '_ | '| | ' / _` | \ \ \ \
\/ _)| |)| | | | | || (| | ) ) ) )
' |____| .|| ||| |__, | / / / /
=========||==============|/=///_/
:: Spring Boot :: (v1.5.3.RELEASE)
[20170526101814445][main][SpringApplication.logStartupProfileInfo]No active profile set, falling back to default profiles: default
[20170526101816285][main][ConfigurationClassPostProcessor.enhanceConfigurationClasses]Cannot enhance @Configuration bean definition 'refreshScope' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.
[20170526101825222][main][URLConfigurationSource.<init>]No URLs will be polled as dynamic configuration sources.
[20170526101825224][main][URLConfigurationSource.<init>]To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
[20170526101825255][main][URLConfigurationSource.<init>]No URLs will be polled as dynamic configuration sources.
[20170526101825258][main][URLConfigurationSource.<init>]To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
[20170526101827448][main][DiscoveryJerseyProvider.<init>]Using JSON encoding codec LegacyJacksonJson
[20170526101827454][main][DiscoveryJerseyProvider.<init>]Using JSON decoding codec LegacyJacksonJson
[20170526101827811][main][DiscoveryJerseyProvider.<init>]Using XML encoding codec XStreamXml
[20170526101827811][main][DiscoveryJerseyProvider.<init>]Using XML decoding codec XStreamXml
[20170526101828342][main][ConfigClusterResolver.getClusterEndpoints]Resolving eureka endpoints via configuration
[20170526101828662][main][DiscoveryClient.fetchRegistry]Disable delta property : false
[20170526101828662][main][DiscoveryClient.fetchRegistry]Single vip registry refresh property : null
[20170526101828662][main][DiscoveryClient.fetchRegistry]Force full registry fetch : false
[20170526101828663][main][DiscoveryClient.fetchRegistry]Application is null : false
[20170526101828663][main][DiscoveryClient.fetchRegistry]Registered Applications size is zero : true
[20170526101828663][main][DiscoveryClient.fetchRegistry]Application version is -1: true
[20170526101828663][main][DiscoveryClient.getAndStoreFullRegistry]Getting all instance registry info from the eureka server
[20170526101829165][main][DiscoveryClient.getAndStoreFullRegistry]The response status is 200
[20170526101829167][main][DiscoveryClient.initScheduledTasks]Starting heartbeat executor: renew interval is: 5
[20170526101829181][main][InstanceInfoReplicator.<init>]InstanceInfoReplicator onDemand update allowed rate per min is 4
[20170526101829185][main][DiscoveryClient.<init>]Discovery Client initialized at timestamp 1495765109185 with initial instances count: 2
[20170526101829274][main][DiscoveryClient$3.notify]Saw local status change event StatusChangeEvent [timestamp=1495765109274, current=UP, previous=STARTING]
[20170526101829278][DiscoveryClient-InstanceInfoReplicator-0][DiscoveryClient.register]DiscoveryClient_CLIENT-CONSUMER-RIBBON/client-consumer-ribbon:3100: registering service...
[20170526101829386][DiscoveryClient-InstanceInfoReplicator-0][DiscoveryClient.register]DiscoveryClient_CLIENT-CONSUMER-RIBBON/client-consumer-ribbon:3100 - registration status: 204
[20170526101829694][main][StartupInfoLogger.logStarted]Started ServiceClient01BootStarp in 19.749 seconds (JVM running for 21.296)
訪問(wèn)localhost:1100,發(fā)現(xiàn)Application里多了一個(gè)Client-consume-ribbon

多次訪問(wèn)(六次)
http://127.0.0.1:3100/toadd 可以看到兩個(gè)服務(wù)端打印的請(qǐng)求日志是均等輸出的,各輸出三次:

[20170526151033675][http-nio-2100-exec-3][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=30
[20170526151057257][http-nio-2100-exec-1][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=30
[20170526151110916][http-nio-2100-exec-9][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=30

[20170526151036583][http-nio-2200-exec-3][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=30
[20170526151059570][http-nio-2200-exec-1][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=30
[20170526151109162][http-nio-2200-exec-9][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=30
啟動(dòng)服務(wù)消費(fèi)端ServiceClient02(Feign)
部分日志如下:
. ____ _ __ _ _
/\ / _' __ _ () __ __ _ \ \ \ \
( ( )___ | '_ | '| | ' / _` | \ \ \ \
\/ _)| |)| | | | | || (| | ) ) ) )
' |____| .|| ||| |__, | / / / /
=========||==============|/=///_/
:: Spring Boot :: (v1.5.3.RELEASE)
[20170526103133421][main][SpringApplication.logStartupProfileInfo]No active profile set, falling back to default profiles: default
[20170526103135610][main][ConfigurationClassPostProcessor.enhanceConfigurationClasses]Cannot enhance @Configuration bean definition 'refreshScope' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.
[20170526103143115][main][URLConfigurationSource.<init>]No URLs will be polled as dynamic configuration sources.
[20170526103143116][main][URLConfigurationSource.<init>]To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
[20170526103143137][main][URLConfigurationSource.<init>]No URLs will be polled as dynamic configuration sources.
[20170526103143138][main][URLConfigurationSource.<init>]To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
[20170526103144853][main][DiscoveryJerseyProvider.<init>]Using JSON encoding codec LegacyJacksonJson
[20170526103144858][main][DiscoveryJerseyProvider.<init>]Using JSON decoding codec LegacyJacksonJson
[20170526103145270][main][DiscoveryJerseyProvider.<init>]Using XML encoding codec XStreamXml
[20170526103145270][main][DiscoveryJerseyProvider.<init>]Using XML decoding codec XStreamXml
[20170526103145932][main][ConfigClusterResolver.getClusterEndpoints]Resolving eureka endpoints via configuration
[20170526103146163][main][DiscoveryClient.fetchRegistry]Disable delta property : false
[20170526103146163][main][DiscoveryClient.fetchRegistry]Single vip registry refresh property : null
[20170526103146163][main][DiscoveryClient.fetchRegistry]Force full registry fetch : false
[20170526103146164][main][DiscoveryClient.fetchRegistry]Application is null : false
[20170526103146164][main][DiscoveryClient.fetchRegistry]Registered Applications size is zero : true
[20170526103146164][main][DiscoveryClient.fetchRegistry]Application version is -1: true
[20170526103146164][main][DiscoveryClient.getAndStoreFullRegistry]Getting all instance registry info from the eureka server
[20170526103146695][main][DiscoveryClient.getAndStoreFullRegistry]The response status is 200
[20170526103146697][main][DiscoveryClient.initScheduledTasks]Starting heartbeat executor: renew interval is: 5
[20170526103146700][main][InstanceInfoReplicator.<init>]InstanceInfoReplicator onDemand update allowed rate per min is 4
[20170526103146707][main][DiscoveryClient.<init>]Discovery Client initialized at timestamp 1495765906706 with initial instances count: 3
[20170526103146794][main][DiscoveryClient$3.notify]Saw local status change event StatusChangeEvent [timestamp=1495765906794, current=UP, previous=STARTING]
[20170526103146810][DiscoveryClient-InstanceInfoReplicator-0][DiscoveryClient.register]DiscoveryClient_CLIENT-CONSUMER-FEIGN/client-consumer-feign:3200: registering service...
[20170526103146897][DiscoveryClient-InstanceInfoReplicator-0][DiscoveryClient.register]DiscoveryClient_CLIENT-CONSUMER-FEIGN/client-consumer-feign:3200 - registration status: 204
[20170526103147401][main][StartupInfoLogger.logStarted]Started ServiceClient02BootStarp in 18.382 seconds (JVM running for 19.856)
訪問(wèn)localhost:1100,發(fā)現(xiàn)Application多了一個(gè)Client-Consume-Feign

訪問(wèn)127.0.0.1:3200/demo/feign/toad?a=11&b=22

多次訪問(wèn)(六次)
http://127.0.0.1:3200/demo/feign/toadd?a=20&b=40
可以看到兩個(gè)服務(wù)端打印的請(qǐng)求日志是均等輸出的,各輸出三次:

[20170526151424081][http-nio-2100-exec-6][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=60
[20170526151430819][http-nio-2100-exec-5][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=60
[20170526151437541][AsyncResolver-bootstrap-executor-0][ConfigClusterResolver.getClusterEndpoints]Resolving eureka endpoints via configuration
[20170526151500833][http-nio-2100-exec-3][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=60

[20170526151428657][http-nio-2200-exec-8][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=60
[20170526151444082][http-nio-2200-exec-5][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=60
[20170526151458507][http-nio-2200-exec-3][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=60
遇到問(wèn)題:
如果將service-client-01的ConsumerController改為:
<pre>
@RequestMapping(value = "/toadd",method = RequestMethod.GET)**
public int toadd(@RequestParam int a, @RequestParam int b){
InstanceInfo instance = eurekaClient.getNextServerFromEureka("CalculatorServer",false);
Integer r = a + b;
logger.info("/add, host:" **+instance.getHostName() + **",serviceId:" **+ instance.getInstanceId() + **",result:" **+ r);
return calculatorService.addService(a, b);}
</pre>
CaculatorService.Class:
<pre>
@Service
**class **CalculatorService {
@Resource
**private *RestTemplate restTemplate;
// @RequestMapping(value="add",method = RequestMethod.GET)****
// int addService(@RequestParam("a") int a,@RequestParam("b") int b){****
// String reqURL = "http://CalculatorServer/add?a=" + a + "&b=" + b;****
// //String reqURL = "http://CalculatorServer:3100/demo/ribbon/toadd?a=" + a + "&b=" +b;****
// return restTemplate.getForEntity(reqURL, Integer.class).getBody();****
//****
// }****
**public int addService(int a,int **b){
String reqURL = **"http://CalculatorServer/add?a=" **+ a + **"&b=" **+ b;
**return restTemplate.getForEntity(reqURL,Integer.class).getBody();
}
}
</pre>
訪問(wèn):
http://127.0.0.1:3100/toadd?a=100&b=200
報(bào)錯(cuò)如下;
**Whitelabel Error Page****
**
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri May 26 16:02:40 CST 2017
There was an unexpected error (type=Bad Request, status=400).
Could not read JSON document: Can not deserialize instance of java.lang.Integer out of START_OBJECT token at [Source: java.io.PushbackInputStream@47bf45de; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.Integer out of START_OBJECT token at [Source: java.io.PushbackInputStream@47bf45de; line: 1, column: 1]
但是四次訪問(wèn)卻是負(fù)載均衡的:

[20170526161145179][http-nio-2100-exec-5][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=300
[20170526161149228][http-nio-2100-exec-4][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=300
[20170526161437557][AsyncResolver-bootstrap-executor-0][ConfigClusterResolver.getClusterEndpoints]Resolving eureka endpoints via configuration
[20170526161450505][http-nio-2100-exec-3][CalculatorController.add]uri=http://172.25.126.162:2100,
serviceId=CalculatorServer,result=300

[20170526161147229][http-nio-2200-exec-8][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=300
[20170526161151024][http-nio-2200-exec-6][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=300
[20170526161314964][AsyncResolver-bootstrap-executor-0][ConfigClusterResolver.getClusterEndpoints]Resolving eureka endpoints via configuration
[20170526161448600][http-nio-2200-exec-5][CalculatorController.add]uri=http://172.25.126.162:2200,
serviceId=CalculatorServer,result=300