通过上面的案例可以清楚的看到,Dubbo的注册中心是借助于外部第三方的技术(主要以zookeeper为主),而SpringCloud是自己搞出来的一个注册中心EureKa。然后一个服务的提供者来提供服务,然后暴露自己的服务名称。服务的消费者看到了以后呢自己去那提供者的名称自己去消费,这里面底层的还是基于RPC的远程通信调用。那么消费者在调用的时候呢用到了一个对象RestTemplter,这个对象实在消费者方发起的。但是在用的过程中其实还好,就是我们自己得写接口的实现类。然后在实现对象中再去用RestTemplter对象去拼接URL地址,返回值类型的class对象。这样做用起来没啥问题的,但是不方便管理。原因很简单,一个service的实现类中我们可以用RestTemplter对象去远程调用多个服务的提供者。那么就存在一个service的实现对象里调用多个服务提供者的URL。这样后期管理起来很乱。我们做研发的其中有个原则就是统一配置、分类管理。那么这样的话我们就想把一个服务提供者的所有提供调用的方法全部集中到一块,而另外一个服务提供者的所有提供调用的方法全部集中到另外一块。那么这样就很好管理了。那么这样做的方法SpringCloud给我们提供了就是:Feign方式。注意用Feign这种创建的服务消费端,它的底层还是对RestTemplter对象的封装,主要封装了RestTemplter对象对提供者的调用访问的URL地址和放回的参数类型。下面搞了个案例:
第一步:在上一篇中的porject里面创建一个model,创建方式上一篇有。
第二步:选择相关的依赖:
第三步:配置相关的设置。
#配置服务消费者的端口号
server.port=6040
#配置服务消费者的名称,用于计算依赖
spring.application.name=server-consumer-01
#配置链接注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:6010/eureka
第四步:在启动对象中添加相应的注解:
package com.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServerConsumer01Application {
public static void main(String[] args) {
SpringApplication.run(ServerConsumer01Application.class, args);
}
}
第五步:添加供web访问的controller和service
package com.alibaba.controller;
import com.alibaba.Service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class UserController {
@Resource
UserService userService;
@RequestMapping("/getUserMassage")
public String getUserMassage(String username){
return this.userService.getUserMassage(username);
}
}
说明一下:上面的service层中的接口上面注解@FeignClient里面填写的是服务提供者在注册中心注册的application的名字,根据这个名字和方法上面的RequestMapping中的映射,Feign会自动的拼接http://、请求参数等请求调用服务提供者的url,最后Fegin拼接出来的请求url就是和RestTemplter里写的是一致的。拼接出来将这个url地址和返回值的参数类型传递给底层的RestTemolter对象,其实最终还是由RestTemplter去调用服务提供者的。