springcloud-是什么?
ribbon定制小程序开发是开发的一套负载均衡的工具,只要为ribbon定制小程序开发提供应用程序名,定制小程序开发就可以实现负债均衡。ribbon提供了很多负载均衡算法。也就是com.netflix.loadbalancer.IRule接口的实现类。我们也可以自己定义负载均衡算法。
ribbon架构图
ribbon具体代码实现
1.首先我们需要一个eureka注册中心,最少两个服务提供者,一个服务消费方。
项目结构:
2.客户端我们需要导入eureka客户端的pom文件,因为eureka-client已经包含了ribbon的包了,所以不用重复导入。
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
可以看到包含关系
3.在往spring容器里面注入RestTemplate的时候,加上注解LoadBalanced可以通过服务名访问服务提供者,并支持负载均衡。
- import org.springframework.cloud.client.loadbalancer.LoadBalanced;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.client.RestTemplate;
-
- @Configuration
- public class ApplicationConfig {
-
- @Bean
- @LoadBalanced // 多个服务提供者可以轮询调用
- public RestTemplate restTemplate(){
- return new RestTemplate();
- }
-
- }
4.有了LoadBalanced注解,我们可以不用写ip地址,直接写应用的名称。 比如我们有两个一样的服务只是端口号不同,那就可以通服务名去调用服务。
- import com.xx.job.common.CommonResult;
- import com.xx.job.entity.Payment;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.cloud.client.ServiceInstance;
- import org.springframework.cloud.client.discovery.DiscoveryClient;
- import org.springframework.http.ResponseEntity;
- import org.springframework.web.bind.annotation.*;
- import org.springframework.web.client.RestTemplate;
-
- import java.util.List;
-
- @RestController
- @RequestMapping("/consumer")
- public class ConsumerController {
-
- // 有了LoadBalanced注解,我们可以不用写ip地址,直接写应用的名称。
- // 比如我们有两个一样的服务只是端口号不同,那就可以通服务名去调用服务。
- public static final String URI = "http://SPRING-CLOUD-PAYMENT";
-
- @Autowired
- private RestTemplate restTemplate;
- @Autowired
- private DiscoveryClient discoveryClient;
-
- @GetMapping("/selectById/{id}")
- public CommonResult selectById(@PathVariable Long id){
- ResponseEntity<CommonResult> forEntity = restTemplate.getForEntity(URI + "/payment/selectById/" + id, CommonResult.class);
- CommonResult body = forEntity.getBody();
- return body;
- }
-
- @GetMapping("/insert")
- public CommonResult insert( Payment payment){
- ResponseEntity<CommonResult> forEntity = restTemplate.postForEntity(URI + "/payment/insert", payment, CommonResult.class);
- return forEntity.getBody();
- }
-
- @GetMapping("/discovery")
- public Object discoveryClient(){
- List<String> services = discoveryClient.getServices();
- services.forEach(x->{
- System.out.println(x);
- });
-
- List<ServiceInstance> instances = discoveryClient.getInstances("SPRING-CLOUD-PAYMENT");
- instances.forEach(x->{
- System.out.println(x.getHost());
- System.out.println(x.getInstanceId());
- System.out.println(x.getPort());
- System.out.println(x.getServiceId());
- System.out.println(x.getUri());
- System.out.println(x.getMetadata());
- System.out.println(x.getScheme());
- System.out.println("------------------------");
- });
-
- return discoveryClient;
- }
- }
5.Ribbon更换默认 RandomRule(随机)
注意:默认算法配置类不能放到@ComponentScan注解同级或者子级。
- import com.netflix.loadbalancer.RandomRule;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- public class MyRandomRule {
-
- @Bean
- public RandomRule randomRule(){
- return new RandomRule();
- }
-
- }
负载均衡算法有哪些
启动类配置RibbonClient注解,name要调用的服务提供者,configuration负载配置类
- import com.xx.MyRule.MyRandomRule;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
- import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
- import org.springframework.cloud.netflix.ribbon.RibbonClient;
- import org.springframework.cloud.netflix.ribbon.RibbonClients;
-
- @EnableDiscoveryClient
- @EnableEurekaClient
- @SpringBootApplication
- @RibbonClient(name = "SPRING-CLOUD-PAYMENT",configuration = MyRandomRule.class)
- public class OrderConsumer80 {
- public static void main(String[] args) {
- SpringApplication.run(OrderConsumer80.class,args);
- }
- }
6.完成,测试
git地址: