spring cloud - consumer /producer 端使用

本文深入探讨了微服务架构中consumer与producer的角色与实现方式,通过具体代码示例讲解了如何使用Spring Cloud搭建微服务,包括服务注册、服务发现及Feign客户端的编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.所谓消费者,有一定歧义

我们可以称之为为 前端A-----------》后端服务(消费者)B-----------》后端服务(提供者)C,这里consumer其实就是一个后端的服务提供者,只是依赖于C,需要调用C的服务

consumer:代码地址        https://github.com/peng228/spring-cloud-consumer.git

consumer  解析:  和Grpc 有点类似

1. 启动注解:

2.controlelr 注入 

3.Feign  编写

 

producer:代码地址       https://github.com/peng228/spring-cloud-producer.git

1.配置文件指定,appname 注册到注册中心,调用者根据服务名称找到此服务

 

2.开启发现注册功能

实验十五 SpringCloud使用 一、实验目的 1、了解SpringCloud的作用 2、掌握SpringCloud的配置使用 3、了解SpringCloud的组件使用方法 二、实验过程 1、编写程序测试Springcloud服务发现过程。首先创建项目springcloud,然后分别创建3个子模块discovery、producercomsumer。(以下配置或代码供参考,注意相关依赖版本JDK版本) a)Springcloud工程的依赖配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <groupId>org.example</groupId> <artifactId>SpringCloud</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <name>SpringCloud</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.0.3.RELEASE</version> <scope>test</scope> </dependency> </dependencies> </project> b)配置discovery服务发现中心 1)相关依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.3.5.RELEASE</version> </dependency> 2)服务中心启动代码 import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } 3)application.yml server.port=8260 eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka c)配置producer服务生产者 1)相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> 2)关键代码 主程序 App.java @EnableDiscoveryClient @SpringBootApplication public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); } } 服务提供程序 PController.java @RestController public class PController{ protected Logger logger = LoggerFactory.getLogger(HelloEndpoint.class); @Autowired private EurekaInstanceConfig eurekaInstanceConfig; @Value("${server.port}") private int serverPort = 0; @RequestMapping(value = "/hello", method = RequestMethod.GET) public String hello() { return "Hello, Spring Cloud! I am from producer 1. My port is " + String.valueOf(serverPort); } } 3)配置application.yml server.port=2100 spring.application.name=SERVICE-HELLO eureka.client.service-url.defaultZone=http://localhost:8260/eureka d)配置consumer服务消费者 1)相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 2)主要代码 主程序 App.java @EnableDiscoveryClient @SpringBootApplication public class ConsumerApp { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ConsumerApp.class, args); } } 服务消费程序 CController.java @RestController public class HelloController { @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/chello", method = RequestMethod.GET) public String hello() { return restTemplate.getForEntity("http://SERVICE-HELLO/hello", String.class).getBody(); } } 3)配置文件application.properties server.port=8080 spring.application.name=consumer-hello eureka.client.service-url.defaultZone=http://localhost:8260/eureka 2、参考以上内容进行代码编写项目配置,分别运行服务发现中心,生产者消费者程序,最后测试消费者是否能够成功消费生产者提供的服务,并将相关过程的结果截图于此。 3、修改消费者模块,用Feign进行改造,使其能够简化服务调用的请求。 4、提交代码文档至超星,命名为“班级+学号+姓名+实验十五.rar”。
最新发布
06-26
<think>我们正在使用SpringCloud构建微服务架构,需要搭建Eureka服务发现中心,并配置生产者(Producer)消费者(Consumer)模块。消费者将使用Feign客户简化对生产者的调用。步骤概览:1.创建Eureka服务器(服务发现中心)2.创建生产者服务(Producer)并注册到Eureka3.创建消费者服务(Consumer)并注册到Eureka,同时使用Feign调用生产者服务详细步骤:一、搭建Eureka服务发现中心1.创建SpringBoot项目,添加EurekaServer依赖。在pom.xml中添加:```xml<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>```2.在启动类上添加`@EnableEurekaServer`注解。```java@SpringBootApplication@EnableEurekaServerpublicclassEurekaServerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EurekaServerApplication.class,args);}}```3.配置application.yml(或application.properties):```yamlserver:port:8761#Eureka默认口eureka:instance:hostname:localhostclient:registerWithEureka:false#不向自己注册fetchRegistry:false#不从自己获取注册信息serviceUrl:defaultZone:http://${eureka.instance.hostname}:${server.port}/eureka/```二、创建生产者服务(Producer)1.创建SpringBoot项目,添加EurekaClient依赖(用于注册到Eureka)Web依赖(用于提供REST服务)。pom.xml:```xml<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>```2.在启动类上添加`@EnableEurekaClient`注解(新版本也可以不加,但为了清晰可以加上)。```java@SpringBootApplication@EnableEurekaClientpublicclassProducerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ProducerApplication.class,args);}}```3.配置application.yml:```yamlserver:port:8081#生产者服务spring:application:name:producer-service#服务名称,消费者将通过这个名称调用eureka:client:serviceUrl:defaultZone:http://localhost:8761/eureka/#Eureka服务器地址```4.编写一个简单的REST接口:```java@RestControllerpublicclassProducerController{@GetMapping("/hello")publicStringhello(){return"HellofromProducer!";}}```三、创建消费者服务(Consumer)并使用Feign调用生产者服务1.创建SpringBoot项目,添加EurekaClient依赖(用于注册到Eureka)Feign依赖。pom.xml:```xml<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>```2.在启动类上添加`@EnableEurekaClient``@EnableFeignClients`注解。```java@SpringBootApplication@EnableEurekaClient@EnableFeignClients//启用Feign客户publicclassConsumerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ConsumerApplication.class,args);}}```3.配置application.yml:```yamlserver:port:8082#消费者服务spring:application:name:consumer-serviceeureka:client:serviceUrl:defaultZone:http://localhost:8761/eureka/```4.创建Feign客户接口,用于调用生产者服务:```java@FeignClient(name="producer-service")//使用服务名称publicinterfaceProducerFeignClient{@GetMapping("/hello")//映射生产者的接口StringcallHello();}```5.在消费者Controller中注入Feign客户并调用:```java@RestControllerpublicclassConsumerController{@AutowiredprivateProducerFeignClientproducerFeignClient;@GetMapping("/call-producer")publicStringcallProducer(){returnproducerFeignClient.callHello();}}```四、测试1.启动Eureka服务器(口8761)2.启动生产者服务(口8081)3.启动消费者服务(口8082)访问Eureka服务器管理界面:http://localhost:8761,应该能看到两个服务已注册。通过消费者服务调用生产者服务:访问http://localhost:8082/call-producer,应该返回"HellofromProducer!"。这样就完成了使用SpringCloud搭建Eureka服务发现中心,并配置了生产者消费者,使用Feign进行服务调用。注意:Feign已经集成了Ribbon负载均衡,如果有多个生产者实例,Feign会自动进行负载均衡调用。引用说明:[^1]:Feign封装了Ribbon负载均衡Eureka服务器访问以及REST格式处理。[^2]:启动类需要添加`@EnableDiscoveryClient``@EnableFeignClients`注解。[^3]:生产者服务的启动类使用`@EnableEurekaClient`,消费者启动类使用`@EnableFeignClients`。[^4]:FeignClient的name属性指定了生产者服务的注册名称,用于服务发现。[^5]:在application.properties(或application.yml)中配置服务名称Eureka服务器地址。§§相关问题§§1.如何在Feign客户中传递请求参数?2.如何配置Feign客户的超时时间?3.如何实现Feign客户的熔断降级(fallback)?</think>### Spring Cloud Eureka与Feign服务调用实现 我将指导您搭建一个完整的Spring Cloud服务发现与调用系统,包括Eureka服务注册中心、生产者(Producer)消费者(Consumer)模块。 --- ### 一、系统架构 ```mermaid graph LR E[Eureka Server:8761] -->|注册| P[Producer] E -->|注册| C[Consumer] C -->|Feign调用| P ``` --- ### 二、实现步骤 #### 1. 创建Eureka服务注册中心 **pom.xml 关键依赖**: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> ``` **启动类**: ```java @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } ``` **application.yml配置**: ```yaml server: port: 8761 eureka: client: register-with-eureka: false # 不注册自己 fetch-registry: false # 不获取注册表 service-url: defaultZone: http://localhost:8761/eureka/ ``` --- #### 2. 创建生产者服务(Producer) **pom.xml 关键依赖**: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` **启动类**: ```java @SpringBootApplication @EnableEurekaClient public class ProducerApplication { public static void main(String[] args) { SpringApplication.run(ProducerApplication.class, args); } } ``` **application.yml配置**: ```yaml server: port: 8081 spring: application: name: producer-service # 服务标识名 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ ``` **生产者接口**: ```java @RestController public class ProducerController { @GetMapping("/hello") public String hello(@RequestParam String name) { return "Hello, " + name + "! From Producer"; } } ``` --- #### 3. 创建消费者服务(Consumer)使用Feign **pom.xml 关键依赖**: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` **启动类**: ```java @SpringBootApplication @EnableFeignClients // 启用Feign @EnableEurekaClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } ``` **Feign客户接口**: ```java @FeignClient(name = "producer-service") // 使用服务名 public interface ProducerFeignClient { @GetMapping("/hello") String callHello(@RequestParam("name") String name); } ``` **消费者控制器**: ```java @RestController public class ConsumerController { @Autowired private ProducerFeignClient feignClient; @GetMapping("/call-producer") public String callProducer(@RequestParam String name) { return feignClient.callHello(name); } } ``` **application.yml配置**: ```yaml server: port: 8082 spring: application: name: consumer-service eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ feign: client: config: default: # Feign全局配置 connectTimeout: 5000 # 连接超时 readTimeout: 5000 # 读取超时 ``` --- ### 三、测试流程 1. 启动顺序: ``` Eureka Server → ProducerConsumer ``` 2. 访问Eureka控制台: http://localhost:8761 应看到`PRODUCER-SERVICE``CONSUMER-SERVICE`已注册 3. 测试Feign调用: ``` http://localhost:8082/call-producer?name=SpringCloud ``` 返回结果:`Hello, SpringCloud! From Producer` --- ### 四、关键机制解析 1. **服务发现过程**: - 服务启动时向Eureka注册元数据(IP、口、健康指标) - Eureka每30秒心跳检测服务可用性[^1] - Feign通过服务名`producer-service`解析实际地址 2. **Feign工作原理**: - 动态生成接口实现类 - 集成Ribbon实现负载均衡 - 自动处理HTTP请求/响应序列化[^4] 3. **配置要点**: - `@EnableFeignClients`扫描Feign接口 - `@FeignClient`的name必须匹配生产者服务名 - 超时配置防止调用阻塞[^4] > **注意**:当启动多个生产者实例时,Feign会自动实现负载均衡,这是通过内置的Ribbon组件完成的[^1]。 --- ### 五、常见问题解决 1. **服务注册失败**: - 检查`defaultZone`地址是否正确 - 确认依赖包含`eureka-client` 2. **Feign调用报404**: - 确认生产者接口路径完全匹配 - 检查`@FeignClient`的name与服务名一致 3. **调用超时**: ```yaml feign: client: config: default: connectTimeout: 3000 readTimeout: 5000 ``` --- ### 六、扩展优化 1. **添加Hystrix熔断**: ```java @FeignClient(name = "producer-service", fallback = ProducerFallback.class) ``` 2. **启用请求压缩**: ```yaml feign: compression: request: enabled: true ``` 3. **日志调试**: ```java @Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } } ``` [^1]: Feign封装了Ribbon负载均衡Eureka服务器访问,简化了服务调用过程 [^2]: 启动类需要添加`@EnableDiscoveryClient``@EnableFeignClients`注解 [^3]: 生产者服务注册使用`@EnableEurekaClient`注解 [^4]: FeignClient的name属性对应生产者服务的注册名称 [^5]: Eureka客户配置需要指定服务注册中心地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值