搭建前言
接着前面的几文章我们已经搭建好了注册中心和服务的生产者,这篇文章我们来搭建服务的消费方。
SpringBoot版本:2.0 2.0.4.RELEASE
spring-cloud-dependencies 版本:Finchley.SR1
pom:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
配置文件
spring.application.name=eureka-consumer
# Eureka 注册中心地址
eureka.client.service-url.defaultZone=http://localhost:10000/eureka/
management.endpoints.web.exposure.include=refresh,health,info,env,loggers,metrics,trace,dump
management.endpoint.health.show-details=always
# Ϊ11000 11001 11002 ...
server.port= 8080
启动类
@EnableFeignClients
@SpringBootApplication
@ComponentScan(value = "cn.lpck.eurekaconsumerfeign")
public class EurekaConsumerFeignApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerFeignApplication.class, args);
}
}
注解解释:@EnableFeignClients
:由于我们使用的试Feign 组件 ,我们需要在SpringBoot的启动类里面去开启Feign 组件的客户端,在启动时即注册。@ComponentScan(value = "cn.lpck.eurekaconsumerfeign")
: 组件扫描,识别feign组件
SpringCloud 发展至今提供了很多组件,我们去官方查看大概是有二十几个组件.使用Feign的好处就是他其实是封装了Http请求,简化了原本复杂的框架,实现了类似于Dubbo的@Refrence
注解的作用,但是二者实现的原理却大不一样。
消费使用
到了这里我们其实就已经实现整个SpringCloud框架种最核心的SOA思想,搭建不同的生产者与消费者就可以实现业务拆分.
消费者的服务请求接口
/**
* @Author: Liupu
* @Date: 2018/9/12 0012 上午 11:46
* @Description:
* @Version 1.0
*/
@Component
@FeignClient(name = "eureka-producer")
public interface HelloService {
@GetMapping("/hello/")
String hello(@RequestParam(value= "name") String name);
/* @RequestMapping("/hello/{user}")
String getHello(@PathVariable("user") String user);*/
@GetMapping("/hello/name")
List<String> getNames(@RequestParam("name") String name);
}
下面贴上我们之前搭建好的生产者的Controller
/**
* @Author: Liupu
* @Date: 2018/9/11 0011 下午 4:52
* @Description:
* @Version 1.0
*/
@RestController
@RequestMapping("/hello")
public class HelloController {
@Autowired
private UserService userService;
@GetMapping("/")
public String getHello(@RequestParam String name){
return "hello,"+ name +" "+ new Date();
}
/*@RequestMapping("/user")
public String helloUser(@RequestParam String name){
return "hello,"+ name +"aboyliupu"+ new Date();
}*/
@GetMapping("/name")
public List<String> getList(@RequestParam String name){
ArrayList<String> names = new ArrayList<>();
names.add("aaa");
names.add(name);
return names;
}
}
分析:消费者接口中的子父Mapping 与生产者中的子父Mapping一样,然后通过注解@FeignClient(name = "eureka-producer")
指向我们的消费者中心找到整个消费者然后就请求接口中的数据.
如果抛开整个生产者和注册中心来看,这个项目就像是一个数据表现层,没有自己获取数据的能力,所有数据由第三方的接口提供。
然后再看整个项目 SOA的思想已经通过 生产者-----注册中心-----消费者 体现的淋漓尽致。我们学习分布式框架的目的也就是为了理解这样的一套架构思想。
最后再看下 消费者的Controller
/**
* @Author: Liupu
* @Date: 2018/9/12 0012 上午 11:44
* @Description:feign 可以实现负载均衡 :@Value("${config.producer.instance:0}")
* 需要打包启动 类似注册中心集群
* @Version 1.0
*/
@RestController
@RequestMapping("/hello")
public class HelloController {
@Autowired
HelloService helloService;
@GetMapping("/{name}")
public String index(@PathVariable("name") String name) {
return helloService.hello(name + "!");
}
@GetMapping("/name/{name}")
public List<String> getNames(@PathVariable("name") String name){
List<String> names = helloService.getNames(name);
return names;
}
}