目录

普遍的解决办法

异常解析

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/

开启多个

load balance does not have load balance does not have a_spring

修改服务端模块的端口,返回给消费端不同的标识,打成不同端口的jar包,java -jar 包名运行,Ctrl+C结束运行。用消费者请求服务者,发现默认情况三个服务被轮流调用。

可能遇到报错

java.nio.charset.MalformedInputException: Input length = 1 mybatis绑定失败
其中一个最容易找的原因是interface 和 xml的 namespace 对应不上
还有一种情况是application.yml的编码问题,统一所有文件的编码,或者根本找不到yml,jar包在离开项目目录运行不了