Java中初步实现负载均衡

Java中初步实现负载均衡,第1张

Java中初步实现负载均衡 在消费端实现负载均衡 1.启动类代码:
@SpringBootApplication
public class ConsumerApplication {
    
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    
    @Bean
    @LoadBalanced
    public RestTemplate loadBalanceRestTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

2.控制类代码:
@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;
    //打开浏览器
    //访问:http://localhost:8090/consumer/doRestEcho1
    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho1(){
        String url="http://localhost:8081/provider/echo/8090";
        return restTemplate.getForObject(url,//远端服务的url
                String.class);//远端服务url对应的返回值类型(ResponseType)
    }

    
    @Autowired
    private LoadBalancerClient loadBalancerClient;//RibbonLoadBalancerClient
    @Value("${spring.application.name:8090}")
    private String appName;

    //Consumer-->Provider
    //访问http://localhost:8090/consumer/doRestEcho2
    @GetMapping("/consumer/doRestEcho2")
    public String doRestEcho2(){
        //1.基于服务名获取服务实例
        ServiceInstance serviceInstance = //alt+回车 可以生成变量
                loadBalancerClient.choose("sca-provider");//serviceId为nacos中的服务名
        //2.基于服务实例构建要访问的服务的url
        String ip=serviceInstance.getHost();
        int port=serviceInstance.getPort();
        //String url="http://"+ip+":"+port+"/provider/echo/8090";
        String url=String.format("http://%s:%s/provider/echo/{msg}",ip,port);

        
        //String url=String.format("http://%s:%s/provider/echo/{msg}",ip,port,appName);
        return restTemplate.getForObject(url,//远端服务的url
                String.class,appName);//远端服务url对应的返回值类型(ResponseType)
    }
    @Autowired
    private RestTemplate loadBalanceRestTemplate;
    @GetMapping("/consumer/doRestEcho3")
    public String doRestEcho3(){
        String url=String.format("http://%s/provider/echo/{msg}","sca-provider");
        
        return loadBalanceRestTemplate.getForObject(url,String.class,appName);
    }
}
3.分析 第一部分


1.restTemplate在此处引用, 需要提前在启动类中交给spring容器管理,具体实现:

@Bean
public RestTemplate restTemplate(){
    return new RestTemplate();
}

2.restTemplate.getForObject()方法, 主要用来访问远端服务器,其中需要的三个参数
url:远端服务器访问地址
responseType:远端服务器接收请求后的返回值类型
uriVariavbles:可变参数类型,可省略,在三部分中,会用到

第二部分

控制类中:

1.控制类中,自动注入了loadBalancerClient,而且不需要再启动类手动交给spring容器管理
ServiceInstance serviceInstance =loadBalancerClient.choose(“sca-provider”): 通过服务名获取服务实例,所获 取的对象中有两个方法可分别用于获取地址和端口号:

String ip=serviceInstance.getHost();
int port=serviceInstance.getPort();

2.String url=String.format(“http://%s:%s/provider/echo/{msg}”,ip,port)
此方法用来拼接string字符串%s表示占一串字符串的位置,其后的参数分别替换第一个%s和第二个%s
3.具体的请求

return restTemplate.getForObject(url, String.class,appName);

第三个参数用来表示可变参数的传参,可给{msg}传参.

第三部分

启动类中:

1.@LoadBalanced与@bean同时注解修饰RestTemplate的时候, 此时RestTemplate的容器对象具备了负载均衡的功能,由此创建的对象默认通过负载均衡的方式来访问远程服务器

2.若更改默认的负载均衡方式可在apllication.yml中修改(以后将写在配置中心),例如:RandomRule随机负载均衡

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5596645.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存