服务中心相互注册RestTemplate自动录找nacos 服务实例

RestTemplateConfig 配置信息

@Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplateBuilder().build();
        restTemplate.setRequestFactory(clientHttpRequestFactory());
        return restTemplate;
    }
  
    @Bean
    public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
        try {
            HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
            SSLContext sslContext = new SSLContextBuilder()
                    .loadTrustMaterial(null, (TrustStrategy) (arg0, arg1) -> true).build();
            httpClientBuilder.setSSLContext(sslContext);
            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
                    hostnameVerifier);
            // 注册http和https请求
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .register("https", sslConnectionSocketFactory).build();
            // 开始设置连接池
            PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(
                    socketFactoryRegistry);
            // 最大连接数500
            poolingHttpClientConnectionManager.setMaxTotal(500);
            // 同路由并发数100
            poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
            // 重试次数
            httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
            httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));
            // httpClient连接配置
            CloseableHttpClient httpClient = httpClientBuilder.build();
            HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(
                    httpClient);
            // 连接超时
            clientHttpRequestFactory.setConnectTimeout(20000);
            // 数据读取超时时间
            clientHttpRequestFactory.setReadTimeout(30000);
            // 连接不够用的等待时间
            clientHttpRequestFactory.setConnectionRequestTimeout(20000);
            
            return clientHttpRequestFactory;
        } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
            log.error("初始化HTTP连接池出错", e);
        }
        return null;
    }

服务中心相互注册

  private static final String APPLICATION = "xxx";
    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    @Autowired
    private NacosRegistration registration;

    @Value("${register.server.urls:-}")
    private String serverUrls;

    @Value("${register.server.name:-}")
    private String serverName;
    
    @EventListener
    public void event(InstanceRegisteredEvent event) throws Exception {
        if(serverUrls.equals("-")){
            //不需要注册第二个注册中心
            return;
        }
        try {
            for (String serverUrl : serverUrls.split(",")) {
                nacosDiscoveryProperties.setServerAddr(serverUrl);
                String group = nacosDiscoveryProperties.getGroup();
                Instance instance = getNacosInstanceFromRegistration(registration);
                NamingService namingService = NamingFactory.createNamingService(nacosDiscoveryProperties.getNacosProperties());
                namingService.registerInstance(serverName, group, instance);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        
    }

    //@EventListener
    public void event(ApplicationReadyEvent event) throws Exception {
        if("-".equals(serverUrls)){
            //不获取总中心的dcim服务列表
            return;
        }
        nacosDiscoveryProperties.setServerAddr(serverName);
        String group = nacosDiscoveryProperties.getGroup();
        NamingService namingService = NamingFactory.createNamingService(nacosDiscoveryProperties.getNacosProperties());
        List<Instance> dcimInstances = namingService.getAllInstances(APPLICATION, group);
        LoadBalancerUtil.updateInstances(dcimInstances);
        namingService.subscribe(APPLICATION, updateEvent -> {
            if (updateEvent instanceof NamingEvent) {
                LoadBalancerUtil.updateInstances(((NamingEvent) updateEvent).getInstances());
            }
        });
    }


    private Instance getNacosInstanceFromRegistration(Registration registration) {
        Instance instance = new Instance();
        instance.setIp(registration.getHost());
        instance.setPort(registration.getPort());
        instance.setWeight(nacosDiscoveryProperties.getWeight());
        instance.setClusterName(nacosDiscoveryProperties.getClusterName());
        instance.setEnabled(nacosDiscoveryProperties.isInstanceEnabled());
        instance.setMetadata(registration.getMetadata());
        instance.setEphemeral(nacosDiscoveryProperties.isEphemeral());
        return instance;
    }

RestTemplate工具类

 public static String put(RestTemplate restTemplate, Object entity, String url){
        return put(restTemplate,entity,url,String.class);
    }

    public static  <T>T put(RestTemplate restTemplate,Object entity,String url, Class<T> cls){
        logParams(RequestMethod.PUT,url,entity);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<Object> request = new HttpEntity<>(entity,headers);
        ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.PUT, request, cls);
        T result = exchange.getBody();
        log.info("put result:{}",result);
        return result;
    }

    public static String post(RestTemplate restTemplate,Object entity,String url){
        return post(restTemplate,url,entity,String.class);
    }

    /**
     * 得到 参数的字符串
     * @param entity
     * @return
     */
    private static String getStringParams(Object entity){
        if(entity instanceof String){
            return entity.toString();
        }
        return JSONUtil.toJsonStr(entity);
    }

    private static void logParams(RequestMethod method, String url, Object entity){
        String params=getStringParams(entity);
        log.info("{} url:{}  params:{}",method,url,params);
    }

    /**
     * json请求,可以指定header
     */
    public static <T>T post(RestTemplate restTemplate, String url, Object entity, Map<String,String> headerMap, Class<T> cls){
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        if(!CollectionUtils.isEmpty(headerMap)){
            for (Map.Entry<String, String> entry : headerMap.entrySet()) {
                headers.set(entry.getKey(),entry.getValue());
            }
        }

        HttpEntity<Object> request = new HttpEntity<>(entity,headers);
        return executePost(restTemplate,url,request,cls);

    }
    /**
     * json请求
     */
    public static <T>T post(RestTemplate restTemplate,String url, Object entity, Class<T> cls){
        return post(restTemplate,url,entity,null,cls);
    }

    /**
     * 表单请求
     */
    public static <T>T formPost(RestTemplate restTemplate,String url, Map<String, String> params, Map<String,String> headerMap, Class<T> cls){
        HttpHeaders headers = new HttpHeaders();
        if(!CollectionUtils.isEmpty(headerMap)){
            for (Map.Entry<String, String> entry : headerMap.entrySet()) {
                headers.set(entry.getKey(),entry.getValue());
            }
        }
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        HttpEntity<Object> request = new HttpEntity<>(params,headers);
        return executePost(restTemplate,url,request,cls);
    }

    /**
     * post 请求
     */
    private static <T>T executePost(RestTemplate restTemplate,String url, HttpEntity<Object> request, Class<T> cls){
        logParams(RequestMethod.POST,url,request);
        ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.POST, request, cls);
        T body = exchange.getBody();
        log.info("post result:{}", body);
        return body;
    }

    public static <T>T upload(RestTemplate restTemplate, String url, Map<String, String> updateMap, Map<String,String> headerMap , Class<T> returnClass, Resource resource) {
        MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
        HttpHeaders headers = new HttpHeaders();

        if(!CollectionUtils.isEmpty(headerMap)){
            for (Map.Entry<String, String> entry : headerMap.entrySet()) {
                headers.set(entry.getKey(),entry.getValue());
            }
        }


        parts.add("file",resource);
        for (Map.Entry<String, String> entry : updateMap.entrySet()) {
            Object value = entry.getValue();
            String key = entry.getKey();
            log.info("--->upload param key:{},val:{}",key,value);
            parts.add(key,value);
        }

        HttpEntity<Object> httpEntity = new HttpEntity<>(parts, headers);

        ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, returnClass);

        T body = exchange.getBody();
        return body;
    }

    private static <T>T executeGet(RestTemplate restTemplate,String url, HttpEntity<Object> request, Class<T> cls){
        logParams(RequestMethod.GET,url,request);
        ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.GET, request, cls);
        T body = exchange.getBody();
        log.info("get result:{}", body);
        return body;
    }

    public static  String get(RestTemplate restTemplate,String url){
        return get(restTemplate,url,null,String.class);
    }
    public static  <T>T get(RestTemplate restTemplate,String url, Map<String,String> params,Map<String,String> headerMap, Class<T> cls){
        String reqUrl = buildUrl(url,params);
        HttpHeaders headers = new HttpHeaders();
        if(headerMap != null){
            for (Map.Entry<String, String> entry : headerMap.entrySet()) {
                headers.set(entry.getKey(),entry.getValue());
            }
        }
        HttpEntity<Object> request = new HttpEntity<>(headers);
        return executeGet(restTemplate,reqUrl,request,cls);
    }
    /**
     * get 请求
     */
    public static  <T>T get(RestTemplate restTemplate,String url, Map<String,String> params, Class<T> cls){
        String reqUrl = buildUrl(url,params);
        log.info("get url:{}",reqUrl);
        T result = restTemplate.getForObject(reqUrl, cls);
        log.info("get result:{}", getStringParams(result));
        return result;
    }

    /**
     * 设置的url
     */
    private static String buildUrl(String url, Map<String,String> params){
        StringBuilder urlBuiler=new StringBuilder(url);
        if(!url.contains("?")){
            urlBuiler.append("?");
        }
        if(!CollectionUtils.isEmpty(params)){
            for (Map.Entry<String, String> entry : params.entrySet()) {
                urlBuiler.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
        }
        return urlBuiler.toString();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值