SpringCloud第三篇:服务的提供与Feign调用

上一篇,我们介绍了注册中心的搭建,包括集群环境吓注册中心的搭建,这篇文章介绍一下如何使用注册中心,创建一个服务的提供者,使用一个简单的客户端去调用服务端提供的服务。

本篇文章中需要三个角色,分别是服务的提供者,服务的消费者,还有一个是上一篇文章的主角——注册中心Eureka(使用单机版本即可,本篇的示例也会使用单机版本的Eureka)。(了解源码可+求求: 1791743380)

整体流程为:

先启动注册中心Eureka

启动服务的提供者将提供服务,并将服务注册到注册中心Eureka上

启动服务的消费者,在注册中心中找到服务并完成消费

1. 服务提供者

1. pom.xml

4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.6.RELEASE com.springcloud producer 0.0.1-SNAPSHOT producer Demo project for Spring Boot 1.8 Greenwich.SR1 org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import org.springframework.boot spring-boot-maven-plugin

2. 配置文件application.yml

server:  port:8080spring:  application:    name:spring-cloud-producereureka:  client:    service-url:      defaultZone:http://localhost:8761/eureka/

3. 启动类ProducerApplication.java

增加@EnableEurekaClient,如果是其他注册中心可以使用注解@EnableDiscoveryClient来进行服务的注册

packagecom.springcloud.producer;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication@EnableEurekaClientpublicclassProducerApplication{publicstaticvoidmain(String[] args){        SpringApplication.run(ProducerApplication.class, args);    }}

4. Controller

packagecom.springcloud.producer.controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;/** * Created with IntelliJ IDEA. * *@Date: 2019/7/2 *@Time: 0:02 *@email: [email protected] * Description: */@RestControllerpublicclassHelloController{@RequestMapping("/hello")publicStringhello(@RequestParam String name){return"hello "+name+",producer is ready";    }}

先在可以先启动上一篇当中单机版的Eureka,再启动我们刚写好的producer服务提供者,启动成功后,访问链接http://localhost:8761/,可以看到我们的的服务提供者producer已经成功注册在注册中心上了。

SpringCloud第三篇:服务的提供与Feign调用_第1张图片

至此,服务的提供者已经配置完成。

2. 服务消费者

1. pom.xml

4.0.0org.springframework.bootspring-boot-starter-parent2.1.6.RELEASEcom.springcloudconsumers0.0.1-SNAPSHOTconsumersDemo project for Spring Boot1.8Greenwich.SR1org.springframework.cloudspring-cloud-starter-netflix-eureka-clientorg.springframework.bootspring-boot-starter-weborg.springframework.cloudspring-cloud-starter-openfeignorg.springframework.bootspring-boot-starter-testtestorg.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimportorg.springframework.bootspring-boot-maven-plugin

spring-boot-starter-web: 这个包是通用的web开发包,里面包含了spring-web、spring-webmvc等包

spring-cloud-starter-openfeign: 这个包是springcloud对于Feign的封装,Feign是一个声明式的Web服务客户端。它支持Feign本身的注解、JAX-RS注解以及SpringMVC的注解。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。

2. 配置文件application.yml

server:  port:8081spring:  application:    name:spring-cloud-consumerseureka:  client:    service-url:      defaultZone:http://localhost:8761/eureka/

3. 启动类ConsumersApplication.java

同上,增加@EnableEurekaClient,如果是其他注册中心可以使用注解@EnableDiscoveryClient来进行服务的注册

packagecom.springcloud.consumers;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.EnableEurekaClient;importorg.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication@EnableEurekaClient@EnableFeignClientspublicclassConsumersApplication{publicstaticvoidmain(String[] args){        SpringApplication.run(ConsumersApplication.class, args);    }}

@EnableFeignClients: 这个注解是通知SpringBoot在启动的时候,扫描被 @FeignClient 修饰的类,@FeignClient这个注解在进行远程调用的时候会用到。

4. Feign远程调用

Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

创建一个remote接口

packagecom.springcloud.consumers.remote;importorg.springframework.cloud.openfeign.FeignClient;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;/** *@Author: shiyao.wei *@Date: 2019/7/2 11:14 *@Version: 1.0 *@Desc: */@FeignClient(name="spring-cloud-producer")publicinterfaceHelloRemote{@RequestMapping(value ="/hello")Stringhello(@RequestParam(value ="name")String name);}

name:远程服务名,及spring.application.name配置的名称

此类中的方法和远程服务中contoller中的方法名和参数需保持一致

5. web层调用远程接口 Controller

packagecom.springcloud.consumers.controller;importcom.springcloud.consumers.remote.HelloRemote;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/** *@Author: shiyao.wei *@Date: 2019/7/2 11:25 *@Version: 1.0 *@Desc: */@RestControllerpublicclassHelloController{@AutowiredHelloRemote helloRemote;@RequestMapping("/hello/{name}")publicStringindex(@PathVariable("name")String name){returnhelloRemote.hello(name);    }}

现在,一个最简单的服务注册和调用的例子就完成了。

3. 测试

简单调用

顺次启动eureka、producer、consumer三个项目

启动成功后,先在浏览器输入http://localhost:8080/hello?name=springcloud

可以看到页面显示:hello springcloud,producer is ready

证明我们的producer已经正常启动,提供的服务也正常

接下来,我们测试服务消费者,在浏览器中输入:http://localhost:8081/hello/spring

可以看到页面显示:hello spring,producer is ready

说明客户端已经成功的通过feign调用了远程服务hello,并且将结果返回到了浏览器。

负载均衡

将上面的producer复制一份,修改名称为producer2,修改pom.xml中的\\为producer2,修改其中的Controller:

packagecom.springcloud.producer.controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;/** * Created with IntelliJ IDEA. * *@Date: 2019/7/2 *@Time: 0:02 *@email: [email protected] * Description: */@RestControllerpublicclassHelloController{@RequestMapping("/hello")publicStringhello(@RequestParam String name){return"hello "+name+",producer2 is ready";    }}

修改application.yml配置文件启动端口为8082

启动我们刚复制好的producer2,这时可以看一下注册中心Eureka,我们现在已经有两个producer服务了。

SpringCloud第三篇:服务的提供与Feign调用_第2张图片

这时我们再去访问:http://localhost:8081/hello/spring

第一次返回结果:hello spring,producer is ready

第二次返回结果:hello spring,producer2 is ready

连续刷新页面,两个结果会交替出现,说明注册中心提供了服务负载均衡功能。将服务数提高到N个,会发现测试结果一样,请求会自动轮询到每个服务端来处理。    

你可能感兴趣的:(SpringCloud第三篇:服务的提供与Feign调用)