Ribbon是Netflix旗下的一个负载均衡项目,主要实现中间层应用的负载均衡。为Ribbon配置服务提供者地址列表后,Ribbon会根据一定的负载均衡算法自动帮助服务调用者请求。Ribbon默认提供了多种负载均衡算法,如roundrobin、random、weightedroundrobin等,你也可以为Ribbon实现自定义的负载均衡算法。Ribbon具有以下特点:负载均衡器,可以支持可插拔的负载均衡规则,提供对HTTP、TCP、UDP等多种协议的支持。集成负载均衡功能的客户端Feign使用Ribbon实现负载均衡过程:通过在启动类中添加@EnableFeignCleints注解使FeignCleint能够按照Feign规则实现接口,在接口定义中添加@FeignCleint注解。服务启动后,扫描带有@FeignCleint注解的类,将信息注入到ioc容器中作为接口方法调用,通过jdkRequesTemplate的代理生成具体的RequestTemplate,然后生成RequestRequest交给客户端进行处理。客户端可以是HttpUrlConnection、HttpClient或Okhttp。最后将Client封装到LoadBalanceClient类中。该类结合Ribbon类实现负载均衡。OpenFeign使用Ribbon做负载均衡,所以OpenFeign直接内置了Ribbon。引入OpenFeign依赖后,就不需要再专门引入Ribbon依赖了。接下来,我们以gitegg-service-base作为服务的调用者,启动两个不同端口的gitegg-service-system作为服务的被调用者,测试Ribbon的负载均衡。1、首先在gitegg-service-system项目中,新建一个调用的controller方法,返回系统配置的端口号,以区分调用了哪个服务。包com.gitegg.service.system.controller;导入com.gitegg.platform.boot.common.base.Result;导入com.gitegg.service.system.dto.SystemDTO;导入com.gitegg.service.system.service。ISystemService;导入io.swagger.annotations.Api;导入io.swagger.annotations.ApiOperation;导入lombok.RequiredArgsConstructor;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.beans.factory.annotation.Value;导入org.springframework.cloud.context.config.annotation.RefreshScope;导入org.springframework.web.bind.annotation.*;导入javax.validation.Valid;@RestController@RequestMapping(value="system")@RequiredArgsConstructor(onConstructor_=@Autowired)@Api(tags="gitegg-system")@RefreshScopepublicclassSystemController{privatefinalISystemServicesystemService;@Value("${spring.datasource.maxActive}")privateStringnacosMaxActiveType;@Value("${server.port}")privateIntegerserverPort;@GetMapping(value="list")@ApiOperation(value="systemlistinterface")publicObjectlist(){returnsystemService.list();}@GetMapping(value="page")@ApiOperation(value="systempageInterface")publicObjectpage(){returnsystemService.page();}@GetMapping(value="exception")@ApiOperation(value="自定义异常并返回测试接口")publicResultexception(){returnResult.data(systemService.exception());}@PostMapping(value="valid")@ApiOperation(value="参数验证测试接口")publicResultvalid(@Valid@RequestBodySystemDTOsystemDTO){returnResult.data(systemDTO);}@PostMapping(value="nacos")@ApiOperation(value="Nacos读取配置文件测试接口")publicResultnacos(){returnResult.data(nacosMaxActiveType);}@GetMapping(value="api/by/id")@ApiOperation(value="FeginGet调用测试接口")publicResult