服务调用工具

SpringCloud支持两种客户端服务调用工具

  • Rest RestTemplate
  • Feign客户端

Feign客户端

简介

Feign客户端是一个web声明式http远程调用工具,提供了接口和注解方式进行调用。

环境搭建

1、pom文件引入

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、配置文件

###设置feign客户端超时时间
###SpringCloud feign 默认开启支持ribbon
ribbon:
###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
 ReadTimeout: 5000
###指的是建立连接后从服务器读取到可用资源所用的时间。 
 ConnectTimeout: 5000

3、后台相关代码

场景:订单服务调用会员服务

会员服务接口

public interface IMemberService {
	// 实体类和定义接口信息存放在接口项目
	// 代码实现存放在接口实现类里面
	@RequestMapping("/getMember")
	public UserEntity getMember(@RequestParam("name") String name);
}

feign客户端接口

// name 指定服务名称
@FeignClient("app-itmayiedu-member")
public interface MemberServiceFeigin extends IMemberService {
    // 订单服务继承会员服务接口,用来实现feign客户端 减少重复接口代码
}

会员实现类

@RestController
public class OrderServiceImpl implements IOrderService {
	// 订单服务继承会员服务接口,用来实现feign客户端 减少重复接口代码
	@Autowired
	private MemberServiceFeigin memberServiceFeigin;

	@RequestMapping("/orderToMember")
	public String orderToMember(String name) {
		UserEntity user = memberServiceFeigin.getMember(name);
		return user == null ? "没有找到用户信息" : user.toString();
	}
}

项目启动加上@EnableFeignClients

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class AppOrder {
	public static void main(String[] args) {
		SpringApplication.run(AppOrder.class, args);
	}
}

RestTemplate

getForEntity

       getForEntity方法的返回值是一个ResponseEntity<T>,ResponseEntity<T>是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。

@RequestMapping("/getForEntity")
public ResponseEntity<String> getForEntity() {
    //第一个参数为我要调用的服务的地址,这里我调用了服务提供者提供的/hello接口,注意这里是通过服务 
    //名调用而不是服务地址,如果写成服务地址就没法实现客户端负载均衡了
    //第二个参数String.class表示我希望返回的body类型是String
	ResponseEntity<String> response = restTemplate.getForEntity("http://app-lun-member/getMember",String.class);
	System.out.println("statusCode:" + response.getStatusCode());
	System.out.println("Body:" + response.getBody());
	return response;
}

getForObject

@RequestMapping("/getOrder")
public String getOrder() {
	// 有两种方式,一种是采用服务别名方式调用,另一种是直接调用 使用别名去注册中心上获取对应的服务调用地址
	String url = "http://app-lun-member/getMember";
     //getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,
     //对其他信息都不关注,此时可以使用getForObject
	String result = restTemplate.getForObject(url, String.class);
	System.out.println("订单服务调用会员服务result:" + result);
	return result;
}

会员实现类

@RestController
public class OrderServiceImpl{
	@Autowired
	private RestTemplate restTemplate;

	@RequestMapping("/orderToMember")
	public String orderToMember(String name) {
		// 有两种方式,一种是采用服务别名方式调用,
		// 另一种是直接调用 使用别名去注册中心上获取对应的服务调用地址
		String url = "http://app-lun-member/getMember";
		String result = restTemplate.getForObject(url, String.class);
		System.out.println("订单服务调用会员服务result:" + result);
		return result;
	}
}

启动项

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class AppOrder {
	public static void main(String[] args) {
		SpringApplication.run(AppOrder.class, args);
		// 如果使用rest方式以别名方式进行调用依赖ribbon负载均衡器 @LoadBalanced
		// @LoadBalanced就能让这个RestTemplate在请求时拥有客户端负载均衡的能力
	}
	// 解决RestTemplate 找不到原因 应该把restTemplate注册SpringBoot容器中 @bean
	@Bean
	@LoadBalanced
	RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值