SpringCloud微服务学习----------应用的通信调用

RestTemplate的三种使用方式

第一种直接新建对象调用

@Service
public class RoadWorkService {
	
	@Autowired
	private RoadWorkDao resourcesdao;

	public Map<String, Object>  findroadwork() {
		// TODO Auto-generated method stub
		List<Map<String, Object>> list = null ;
		Map<String,Object> map = new HashMap<>();
		
		list = resourcesdao.findroadwork();
		
		//第一种方式,新建resttemplate对象
		RestTemplate resttemplate = new RestTemplate();
		String posttest = resttemplate.getForObject("http://localhost:30522/eurekaApi/test", String.class);
		
		System.err.println(posttest);
		
		map.put("postman", posttest);
		map.put("data", list);
		
		return map;
	}

}

并无聊的测试了一下这样没有在Eureka Server服务中心注册也可以互相调用(这样当然可以调用了,因为你写死了地址。。

这种方法的缺点就是url必须写死。。。。,而且假如对应服务服务有启用了负载均衡,有两个服务,那么他更不能确定地址了。

第二种方法是在第一种的方法上增强

@Service
public class RoadWorkService {
	
	@Autowired
	private RoadWorkDao resourcesdao;
	@Autowired
	private LoadBalancerClient loadbalancerclient;

	public Map<String, Object>  findroadwork() {
		// TODO Auto-generated method stub
		List<Map<String, Object>> list = null ;
		Map<String,Object> map = new HashMap<>();
		
		list = resourcesdao.findroadwork();
		//这个填入的id就是配置的id
		ServiceInstance choose = loadbalancerclient.choose("EUREKACLIENT-POSTMAN");
		
		//新学拼接字符串方法。。。。
		String url = String.format("http://%s:%s", choose.getHost(),choose.getPort())+"/eurekaApi/test";
		
		System.out.println(url);
		//这里开始走第一种方法
		RestTemplate restTemplate = new RestTemplate();
		
		String postman = restTemplate.getForObject(url,String.class);
		
		map.put("postman", postman);
		map.put("data", list);
		
		return map;
	}

}

loadbalancerclient.choose("EUREKACLIENT-POSTMAN");传入的id就是如下id

此处测试只开两个客户端服务,会显示找不到,看来这里的id是用到了EurekaServer注册中心

第三种方式,配置和注解来实现

package com.sola.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RoadWorkConfig {
	
	//差别在于在这加一个注解
	@Bean
	@LoadBalanced
	public RestTemplate resttemplate(){
		
		return new RestTemplate();
	}

}

然后过来这么调用

package com.sola.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import com.sola.dao.RoadWorkDao;

@Service
public class RoadWorkService {
	
	@Autowired
	private RoadWorkDao resourcesdao;
	@Autowired
	private RestTemplate resttemplate;

	public Map<String, Object>  findroadwork() {
		// TODO Auto-generated method stub
		List<Map<String, Object>> list = null ;
		Map<String,Object> map = new HashMap<>();
		
		list = resourcesdao.findroadwork();
	
		String forObject = resttemplate.getForObject("http://EUREKACLIENT-POSTMAN/eurekaApi/test", String.class);
		
		map.put("postman", forObject);
		map.put("data", list);
		
		return map;
	}

}

猜你喜欢

转载自blog.csdn.net/jiulanhao/article/details/82623176