目录
普遍的解决办法
异常解析
SpringCloud服务消费搭建
服务端
消费端
注册中心
开启多个
可能遇到报错
普遍的解决办法
Load balancer does not have available server for client
首先,这个错误网上搜了很多文章,提供办法最多的是在配置文件里加入一下代码
ribbon:
eureka:
enabled: false
以及
## 这个BaseRemote是加了@FeignClient注解的类
BaseRemote:
ribbon:
## 服务提供者的地址,不是服务注册中心的地址
listOfServers: http://localhost:8086
但对于刚接触springcloud的孩子来说,出现错误根本不知道为什么,不知道具体怎么操作,相关文章普遍针对作者自己遇到的问题解决,说的很笼统,我跟着走了很多弯路,一直也没搞懂到底是哪个地方写哪个名字。
异常解析
直说出现Load balancer does not have available server for client这个错误的情况比较多,意思是负载均衡找不到那个服务,后面跟着服务名,配置错了,某一个名字写错了都可能触发,只要让他找不到就报这个错。上述解决办法适合一部分情况,手动配置多个服务以及负载均衡策略等,我现在用的是Feign做的消费端,网上还有针对其他方式搭建的解决办法,这就不说了,下面走一遍流程。
SpringCloud服务消费搭建
springboot版本2.0.6.RELEASE springCloud版本Finchley.SR2 可以去搜对应表,版本对不上会冲突,有找不到某个jar包的错报出来
其他无关的省略了,就跟普通springboot一样
服务端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
yml配置
server:
port: 8088
servlet:
context-path: /baseService
spring:
application:
name: base
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://localhost:8081/eureka/
其他的不用管,普通的mvc三层,重点看controller,普通的就好
@ResponseBody
@RequestMapping("getOne")
public String sayhello(@RequestBody String param){
。。。
}
消费端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
server:
port: 9000
servlet:
context-path: /infoService
spring:
application:
name: information
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://localhost:8081/eureka/
消费者其实可以不注册服务,他是消费的,去找服务提供者。
@FeignClient(name= "base")//服务端的名字name,也就是访问Eureka页面显示的那个名字
public interface BaseRemote {
@RequestMapping("baseService/user/getOne")//访问的全路径
String sayhello1(String param);
}
服务端写了@RequestBody,这参数名就不重要了。这样接口就对接上了
@Autowired
BaseRemote baseRemote;
然后调用他请求服务
注册中心
ribbon那个开启了负载均衡
server:
port: 8081
spring:
application:
name: z-eureka
ribbon:
eureka:
enabled: true
eureka:
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:${server.port}/eureka/
开启多个
修改服务端模块的端口,返回给消费端不同的标识,打成不同端口的jar包,java -jar 包名运行,Ctrl+C结束运行。用消费者请求服务者,发现默认情况三个服务被轮流调用。
可能遇到报错
java.nio.charset.MalformedInputException: Input length = 1 mybatis绑定失败
其中一个最容易找的原因是interface 和 xml的 namespace 对应不上
还有一种情况是application.yml的编码问题,统一所有文件的编码,或者根本找不到yml,jar包在离开项目目录运行不了