服务提供与调用

简介:

服务提供

我们假设服务提供者有一个hello方法,可以根据传入的参数,提供输出“hello xxx,this is first messge”的服务

1、pom包配置

创建一个springboot项目,pom.xml中添加如下配置:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency></dependencies>


2、配置文件

application.properties配置如下:

spring.application.name=spring-cloud-producer
server.port=9000eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

参数在上一篇都已经解释过,这里不多说。

3、启动类

启动类中添加@EnableDiscoveryClient注解

@SpringBootApplication@EnableDiscoveryClientpublic class ProducerApplication {    public static void main(String[] args) {
        SpringApplication.run(ProducerApplication.class, args);
    }
}


4、controller

提供hello服务

@RestControllerpublic class HelloController {    
    @RequestMapping("/hello")    public String index(@RequestParam String name) {        return "hello "+name+",this is first messge";
    }
}

添加@EnableDiscoveryClient注解后,项目就具有了服务注册的功能。启动工程后,就可以在注册中心的页面看到SPRING-CLOUD-PRODUCER服务。

到此服务提供者配置就完成了。

服务调用

1、pom包配置

和服务提供者一致

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency></dependencies>


2、配置文件

application.properties配置如下:

spring.application.name=spring-cloud-consumer
server.port=9001eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/


3、启动类

启动类添加@EnableDiscoveryClient@EnableFeignClients注解。

@SpringBootApplication@EnableDiscoveryClient@EnableFeignClientspublic class ConsumerApplication {    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

}
  • @EnableDiscoveryClient :启用服务注册与发现

  • @EnableFeignClients:启用feign进行远程调用

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

4、feign调用实现

@FeignClient(name= "spring-cloud-producer")public interface HelloRemote {    @RequestMapping(value = "/hello")    public String hello(@RequestParam(value = "name") String name);
}
  • name:远程服务名,及spring.application.name配置的名称

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


5、web层调用远程服务

将HelloRemote注入到controller层,像普通方法一样去调用即可。

@RestControllerpublic class ConsumerController {    @Autowired
    HelloRemote HelloRemote;    
    @RequestMapping("/hello/{name}")    public String index(@PathVariable("name") String name) {        return HelloRemote.hello(name);
    }

}

到此,最简单的一个服务注册与调用的例子就完成了。


测试

简单调用

依次启动spring-cloud-eureka、spring-cloud-producer、spring-cloud-consumer三个项目

先输入:http://localhost:9000/hello?name=neo 检查spring-cloud-producer服务是否正常

返回:hello neo,this is first messge

说明spring-cloud-producer正常启动,提供的服务也正常。

浏览器中输入:http://localhost:9001/hello/neo

返回:hello neo,this is first messge

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

负载均衡

以上面spring-cloud-producer为例子修改,将其中的controller改动如下:

@RestControllerpublic class HelloController {    
    @RequestMapping("/hello")    public String index(@RequestParam String name) {        return "hello "+name+",this is producer 2  send first messge";
    }
}

在配置文件中改动端口:

spring.application.name=spring-cloud-producer
server.port=9003eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

打包启动后,在eureka就会发现两个服务提供者,如下图:

然后在浏览器再次输入:http://localhost:9001/hello/neo 进行测试:

第一次返回结果:hello neo,this is first messge

第二次返回结果:hello neo,this is producer 2 send first messge

不断的进行测试下去会发现两种结果交替出现,说明两个服务中心自动提供了服务均衡负载的功能。如果我们将服务提供者的数量在提高为N个,测试结果一样,请求会自动轮询到每个服务端来处理。



本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1926491,如需转载请自行联系原作者

相关文章
|
传感器
STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
5104 1
STM32:红外传感器代码部分(内含实物图+外部信号流程,编写代码思路+代码+解析代码和扩展应用)
|
数据采集 数据可视化 关系型数据库
【优秀python 数据分析案例】基于python的穷游网酒店数据采集与可视化分析的设计与实现
本文介绍了一个基于Python的穷游网酒店数据采集与可视化分析系统,通过爬虫技术自动抓取酒店信息,并利用数据分析算法和可视化工具,提供了全国主要城市酒店的数量、星级、价格、评分等多维度的深入洞察,旨在为旅行者和酒店经营者提供决策支持。
479 4
【优秀python 数据分析案例】基于python的穷游网酒店数据采集与可视化分析的设计与实现
|
安全 Java Go
最新进展:Go arena 手动管理内存,鸽了!
最新进展:Go arena 手动管理内存,鸽了!
|
SQL Java 数据库连接
MyBatis介绍与下载
MyBatis 介绍 MyBatis是一种开源的Java持久化框架,用于将SQL数据库访问和映射任务与Java对象之间的映射分离。它提供了一种简单的方式来对数据库进行操作,通过使用XML或注解的方式描述数据库操作语句,可以更方便地管理和维护SQL语句。MyBatis具有灵活性和高度可定制性,可以与各种数据库进行集成。 MyBatis 主要特点 1、简单易用:MyBatis采用直观的编程接口,使得数据库操作变得简单和直观。通过使用XML或注解来描述SQL语句,可以快速上手并快速开发。 2、灵活性:MyBatis不强制开发者使用特定的数据模型或数据库访问层结构,而是允许开发者根据自己的需求进行灵活
339 1
|
存储
ArcMap报错ERROR 999999的一种解决方法
本文介绍一种解决ArcGIS中ERROR 999999报错(Configuration RasterCommander ImageServer can not be started)的方法~
765 1
ArcMap报错ERROR 999999的一种解决方法
|
Java Linux API
Java读取Excel表格中的数据
Java读取Excel表格中的数据
Java读取Excel表格中的数据
|
机器学习/深度学习 人工智能 算法
基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
1061 1
成功解决This DCH driver package is not compatible with the currently installed version of Windows. This
成功解决This DCH driver package is not compatible with the currently installed version of Windows. This
成功解决This DCH driver package is not compatible with the currently installed version of Windows. This
|
JavaScript 程序员 编译器
0基础必读!用Python的视角快速理解【组装式开发】
拒绝高大上,这应该是你听过关于【组装式开发】最接地气的解释!
330 1
0基础必读!用Python的视角快速理解【组装式开发】
|
存储 弹性计算 运维
云上的潮玩社区,如何让年轻人念念不忘?
许多潮玩品牌正是看中千岛品牌资源整合的能力,首选在千岛微信小程序上进行新品首发、新品市场测试等业务。由于这些业务流量的激增,在业务架构上,如何有效应对突发流量、保障业务系统稳定性成了至关重要的问题。
1427 0
云上的潮玩社区,如何让年轻人念念不忘?