本篇文章中需要三个角色,分别是服务的提供者,服务的消费者,还有一个是上一篇文章的主角——注册中心Eureka(使用单机版本即可,本篇的示例也会使用单机版本的Eureka)。
整体流程为:
- 先启动注册中心Eureka
- 启动服务的提供者将提供服务,并将服务注册到注册中心Eureka上
- 启动服务的消费者,在注册中心中找到服务并完成消费
1. 服务提供者
1. pom.xml
<?xml version="1.0" encoding="UTF-8"?> <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>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.springcloud</groupId> <artifactId>producer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>producer</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <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.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2. 配置文件application.yml
server: port: 8080 spring: application: name: spring-cloud-producer eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
3. 启动类ProducerApplication.java
增加@EnableEurekaClient,如果是其他注册中心可以使用注解@EnableDiscoveryClient来进行服务的注册
package com.springcloud.producer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class ProducerApplication { public static void main(String[] args) { SpringApplication.run(ProducerApplication.class, args); } }
4. Controller
package com.springcloud.producer.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * Created with IntelliJ IDEA. * * @Date: 2019/7/2 * @Time: 0:02 * @email: inwsy@hotmail.com * Description: */ @RestController public class HelloController { @RequestMapping("/hello") public String hello(@RequestParam String name) { return "hello "+name+",producer is ready"; } }
先在可以先启动上一篇当中单机版的Eureka,再启动我们刚写好的producer服务提供者,启动成功后,访问链接http://localhost:8761/,可以看到我们的的服务提供者producer已经成功注册在注册中心上了。
2. 服务消费者
1. pom.xml
<?xml version="1.0" encoding="UTF-8"?> <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>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.springcloud</groupId> <artifactId>consumers</artifactId> <version>0.0.1-SNAPSHOT</version> <name>consumers</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
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: 8081 spring: application: name: spring-cloud-consumers eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
3. 启动类ConsumersApplication.java
同上,增加@EnableEurekaClient,如果是其他注册中心可以使用注解@EnableDiscoveryClient来进行服务的注册
package com.springcloud.consumers; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableEurekaClient @EnableFeignClients public class ConsumersApplication { public static void main(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接口
package com.springcloud.consumers.remote; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; /** * @Author: shiyao.wei * @Date: 2019/7/2 11:14 * @Version: 1.0 * @Desc: */ @FeignClient(name= "spring-cloud-producer") public interface HelloRemote { @RequestMapping(value = "/hello") String hello(@RequestParam(value = "name") String name); }
- name:远程服务名,及spring.application.name配置的名称
- 此类中的方法和远程服务中contoller中的方法名和参数需保持一致
5. web层调用远程接口 Controller
package com.springcloud.consumers.controller; import com.springcloud.consumers.remote.HelloRemote; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @Author: shiyao.wei * @Date: 2019/7/2 11:25 * @Version: 1.0 * @Desc: */ @RestController public class HelloController { @Autowired HelloRemote helloRemote; @RequestMapping("/hello/{name}") public String index(@PathVariable("name") String name) { return helloRemote.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:
package com.springcloud.producer.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * Created with IntelliJ IDEA. * * @Date: 2019/7/2 * @Time: 0:02 * @email: inwsy@hotmail.com * Description: */ @RestController public class HelloController { @RequestMapping("/hello") public String hello(@RequestParam String name) { return "hello "+name+",producer2 is ready"; } }
修改application.yml配置文件启动端口为8082
启动我们刚复制好的producer2,这时可以看一下注册中心Eureka,我们现在已经有两个producer服务了。
这时我们再去访问:http://localhost:8081/hello/spring
第一次返回结果:hello spring,producer is ready
第二次返回结果:hello spring,producer2 is ready
连续刷新页面,两个结果会交替出现,说明注册中心提供了服务负载均衡功能。将服务数提高到N个,会发现测试结果一样,请求会自动轮询到每个服务端来处理。
相关推荐
尚硅谷是一家知名的IT教育机构,他们推出的Spring Cloud教程系列,旨在帮助开发者深入理解和掌握这一技术。 Spring Cloud是基于Spring Boot的微服务解决方案集合,它为开发者提供了在分布式系统(如配置管理、服务...
Spring Cloud系列教程 Spring Boot Spring Cloud Stream 和 Kafka案例教程 springcloud生产者与消费者项目实战案例 Spring Cloud 中断路器 Circuit Breaker的应用 配置 Spring Cloud Config Server Spring Cloud ...
SpringCloud是Java开发领域中的一款微服务框架,它基于Spring Boot进行构建,为开发者提供了在分布式系统中实现服务治理、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话...
.使用Spring Cloud搭建服务注册中心 2.使用Spring Cloud搭建高可用服务注册中心 3.Spring Cloud中服务的发现与消费 4.Eureka中的核心概念 5.什么是客户端负载均衡 ...31.Spring Cloud系列勘误
* Spring Cloud OpenFeign:提供了基于声明式RESTful服务调用解决方案 Spring Cloud的版本关系: * Spring Cloud和SpringBoot版本对应关系 * Spring Cloud和各子项目版本对应关系 使用Spring Boot开发分布式微...
这个“SpringCloud入门教程系列源码.rar”压缩包显然包含了用于学习 SpringCloud 的一系列示例源代码,旨在帮助初学者理解并掌握如何在实际项目中应用这些核心组件。 1. **Ribbon**: Ribbon 是 Netflix 提供的一个...
在这个"SpringCloud项目例子.zip"压缩包中,我们可以期待找到一系列与SpringCloud相关的实践教程和文档,特别是针对"谷粒商城"这个特定的项目实例。 SpringCloud的核心组件包括: 1. **Eureka**:服务注册与发现。...
而在服务调用方面,Spring Cloud提供了多种解决方案,包括基于Ribbon和RestTemplate的客户端调用,以及基于Feign的声明式REST客户端。 路由网关Zuul是微服务架构中的一个重要组件,它提供了路由转发、权限校验、...
本压缩包"springcloud-learning-master.zip"是一个关于SpringCloud学习的资源合集,包含了一系列的例子和教程,适合想要深入理解和掌握SpringCloud技术的开发者。 首先,我们要了解SpringCloud的基础概念。Spring...
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等...
【SpringCloud】是Java开发领域中的一个热门框架,它是一系列微服务开发工具的集合,旨在简化分布式系统构建,提供了一整套微服务解决方案。SpringCloud基于SpringBoot进行快速搭建,使得开发人员能够轻松地创建出...
本教程将围绕"springCloud系列+IDEA搭建"这一主题,详细介绍如何利用IntelliJ IDEA(简称IDEA)来配置和启动一个基础的Spring Cloud项目,以及其中涉及的关键组件:Eureka、Ribbon、Feign、Hystrix和Zuul。...
### SpringCloud与Kafka消息中间件集成教程 #### 一、SpringCloud概述 Spring Cloud 是一个基于Spring Boot的框架,旨在提供一系列开箱即用的工具和服务,帮助开发者轻松构建和部署微服务架构的应用程序。它集合了...
根据提供的文件标题、描述、标签以及部分内容,我们可以总结并生成一系列与Spring Cloud微服务相关的知识点。下面将详细展开这些知识点: ### Spring Cloud 微服务基础知识 #### 1. 微服务架构简介 - **定义**: ...
SpringCloud提供了一系列的工具,帮助开发者轻松地创建、配置和管理分布式系统。下面将详细介绍SpringCloud的核心组件及其功能。 1. **Eureka**:Eureka是SpringCloud中的服务注册与发现组件。它允许服务提供者向...
1. **Spring Cloud Netflix**:该子项目包含了一系列工具和服务,如 Eureka 用于服务发现,Hystrix 用于实现断路器模式以提高系统的容错性和弹性,Ribbon 提供了客户端负载均衡功能,Feign 则是一个声明式的 REST ...
5. **服务消费者调用**:在其他微服务(即服务消费者)中,通过Spring Cloud的Feign或Ribbon客户端调用服务提供者提供的Excel处理接口。 6. **错误处理和性能优化**:为了保证系统的稳定性和性能,我们需要处理可能...
SpringCloud是中国Java开发者广泛使用的微服务框架之一,它简化了分布式系统开发的复杂性,提供了包括服务注册与发现、配置中心、熔断机制、负载均衡、API网关、消息总线等一系列工具集。本教程“小白轻松学Spring...
标题中的 "springcloud资源" 指的是与 Spring Cloud 相关的学习资料或项目实例,可能是代码示例、教程文档或者是配置模板等。这些资源通常有助于开发者深入理解和掌握 Spring Cloud 的各项组件和工作原理。 描述中...
B站上的"狂神SpringCloud最新教程IDEA版"是一个针对Spring Cloud的实战教学系列,通过IDEA集成开发环境进行演示,帮助开发者掌握这一热门技术。 在Spring Cloud的实践中,首先我们需要了解核心组件: 1. **Eureka*...