SpringCloud之服务提供者和服务消费者
- 编写服务提供者
- 编写服务消费者
微服务构建的是分布式系统,各个微服务之间通过网络进行通信。一般我们用服务提供者和服务消费者来描述微服务之间的调用关系:
服务提供者 |
服务被调用方 |
服务消费者 |
服务的调用方 |
以售票系统为例,用户向12306售票系统发起购票请求,在进行购买业务之前,12306售票系统需要先调用用户微服务接口,查看用户的相关信息是否符合购买标准等相关信息,这里,用户微服务就是服务的提供者,售票系统微服务就是服务消费者。下面依次在Intellij idea中手动创建这两个微服务:
先创建用户微服务:maven的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><groupId>com.simons.cn</groupId><artifactId>user-provider</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.3.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.7</java.version></properties><dependencies><!--支持web应该用开发,包括spring-mvc、jackson、tomcat、spring-webmvc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--springboot Actuator提供了众多检测端点,了解应用程序的运行状况--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--配置mybatis启动器依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.2.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.22</version></dependency><!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.12</version><scope>provided</scope></dependency></dependencies><!-- 引入spring cloud的依赖 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Camden.SR4</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 添加spring-boot的maven插件 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
生成项目后,把通过mybatis反向生成的实体和xml文件copy到相关目录(mybatis反向生成点这里),目录如图:
这里要注意要修改UserMapper.xml中Mapper和User类为你实际路径。
接着编写启动类ProviderUserApplication:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;//扫描*Mapper.java接口文件
@MapperScan("com.simons.cn.mapper")
@SpringBootApplication
public class PrividerUserApplication {public static void main(String[] args) {SpringApplication.run(PrividerUserApplication.class);}
}
@SpringBootApplication是一个组合注解,它整合了@Configuration、@EnableAutoConfiguration和@ComponentScan注解,并且开启了springboot程序组件扫描和自动配置功能;@MapperScan注解用来扫描mapper接口。
接着编写UserController类:
import com.simons.cn.bean.User;
import com.simons.cn.service.UserServiceImpl;
import com.simons.cn.util.CommonEnum;
import com.simons.cn.util.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;@Slf4j
@RestController
public class UserController {@Autowiredprivate UserServiceImpl userService;@GetMapping(value = "/getuserinfo")public CommonResult getUserInfo(@RequestParam(required = false,value = "name") String name){List<User> userList = userService.getUserByName(name);return CommonResult.success(CommonEnum.SUCESS.getCode(),CommonEnum.SUCESS.getMessage(),userList);}
}
@RestController注解声明等价于@Controller和@ResponseBody注解联合作用,标识该类均返回一个rest风格的data;@GetMapping是spring4.3提供的新注解,等价于@RequestMapping(value="/{id}",method=RequestMethod.GET),同理还有@PostMapping()等。
接着编写配置文件application.yml或application.properties均可,我这里是application.yml
server:port: 8000
# 数据库连接信息
spring:datasource:url: jdbc:mysql://×××:3306/simons?rewriteBatchedStatements=true&characterEncoding=utf-8username: ×××password: ×××driver-class-name: com.mysql.jdbc.Driver
# mybatis扫描信息
mybatis:typeAliasesPackage: com.simonsfan.study.bean #实体对象所以在包mapper-locations: classpath:mapper/*.xml #xml文件位置
需要注意的是,yml文件中冒号后面要空一格,例如port: 8000冒号后面一定要空格再接8000
接下来可以启动ProviderUserApplication启动类。
测试:浏览器访问http://localhost:8000/getuserinfo?name=jack,返回
{"code": "0","message": "success","data": [{"id": 125,"name": "jack","role": "system"}]
}
这样,用户微服务就顺利完成。同理,可以编写售票系统的服务消费者。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><groupId>com.simons.cn</groupId><artifactId>ticket-coucumer</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.3.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.7</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.22</version></dependency><!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.12</version><scope>provided</scope></dependency></dependencies><!-- 引入spring cloud的依赖 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Camden.SR4</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 添加spring-boot的maven插件 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
接着我把刚才服务提供者里面要用的一些类都copy到服务消费者来,目录结构如下:
编写启动类ConsumerApplication:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
public class ConsumerApplication {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}
其中@Bean是一个方法注解,作用是实例化一个Bean并使用该方法的名称命名,本例中的用法等价于RestTemplate restTemplate = new RestTemplate()
接着创建TicketController:
import com.simons.cn.util.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@Slf4j
@RestController
public class TicketController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/ticketpurchase")public CommonResult purchaseTicket(@RequestParam(required = false,value = "name") String name){//模拟判断用户身份CommonResult result = restTemplate.getForObject("http://localhost:8000/getuserinfo?name=" + name, CommonResult.class);//买票下单逻辑略return result;}}
这里要注意的是,刚才编写的CommonResult类中一定要添加无参构造函数,否则上面的调用会报错!!!
编写application.yml文件:
server:port: 8888
这样,售票微服务也完成了。启动ConsumerApplication启动类
测试:浏览器访问:http://localhost:9000/ticketpurchase?name=jack,结果如下:
{"code": "0","message": "success","data": [{"id": 125,"name": "jack","role": "system"}]
}
说明售票微服务已经可以正常使用RestTemplate和用户微服务API通信了。
项目的github:https://github.com/simonsfan/SpringCloud.git
SpringCloud之服务提供者和服务消费者相关推荐
- SpringCloud 教程 | 第二篇: 服务消费者(rest+ribbon)
转载请标明出处: blog.csdn.net/forezp/arti- 本文出自方志朋的博客 在上一篇文章,讲了服务的注册和发现.在服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于h ...
- 服务提供者与服务消费者
服务提供者和服务消费者,名词非常的高大上,但是其实很简单,我们看什么是服务提供者,什么是服务消费者,服务的被调用方是服务的提供者,服务的调用方是消费者,以我们之前的电影系统为例,一个用户发起了购票的请 ...
- 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)
转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc02-rest-ribbon/ 本文出自方志朋的博客 最新Finchley版 ...
- Dubbo搭建HelloWorld-搭建服务提供者与服务消费者并完成远程调用(附代码下载)
场景 Dubbo简介与基本概念: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555224 Dubbo环境搭建-ZooKe ...
- 源码分析Dubbo前置篇-寻找注册中心、服务提供者、服务消费者功能入口
本节主要阐述如下两个问题: 1.Dubbo自定义标签实现. 2.dubbo通过Spring加载配置文件后,是如何触发注册中心.服务提供者.服务消费者按照Dubbo的设计执行相关的功能. 所谓的执 ...
- Spring Cloud服务提供者与服务消费者怎么运作的?
在微服务中最基本最基本的两个角色是服务提供者与服务消费者. 之前所有代码都在同一个框架的时候,比如Controller调用Service的,直接注入Service bean即可进行调用了.现在做成微服 ...
- Spring Cloud(四)服务提供者 Eureka + 服务消费者 Feign
上一篇文章,讲述了如何通过RestTemplate + Ribbon去消费服务,这篇文章主要讲述如何通过Feign去消费服务. Feign简介 Feign是一个声明式的伪Http客户端,它使得写Htt ...
- Spring Cloud(三)服务提供者 Eureka + 服务消费者(rest + Ribbon)
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具.它是一个基于HTTP和TCP的客户端负载均衡器.它可以通过在客户端中配置ribbonServer ...
- nacos项目搭建(服务提供者,服务消费者)
spring cloud ablibaba 版本说明 https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明 启动nacos服务 官网: h ...
- Spring Cloud【Finchley】-01服务提供者与服务消费者
文章目录 Spring Cloud总览 概述 示例 场景描述 用户微服务 新建Spring Boot服务 项目结构 用户库表 Model Dao层 Service Controller 暴露Rest ...
最新文章
- 暑期集训1:C++STL 练习题B:HDU-1004
- j2ee html5,HTML5+J2EE实现文件异步上传
- 防屏蔽浏览器_彻底解决安卓手机通知管理难题,顺便还实现了聊天消息防撤回!...
- 神策数据简宁:如何更好地借助数据驱动产品价值提升?
- 小编带你了解oracle使用索引和不使用索引性能分析
- hp-ux mysql_HP-UX安装MySQL
- NGUI如何创建自己的精灵图集
- php strtoupper 和 array_change_key_case 字符串转大写,小写
- com 名字对象(3)使用IMoniker
- numpy常用函数(更新中)
- 【推荐实践】信息流推荐在凤凰新闻的业务实践
- 清华大学操作系统OS学习(二)——OS基本概念
- Tp 引入 simple_html_dom.php
- 迁移linux系统到新硬盘
- 微信好友只有昵称没有微信号_为什么有些好友名片有显示微信号,有些却没有,怎么回事?急...
- hdwiki下model目录功能
- 13.请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。
- MTK平台 SIM双卡改成单卡修改
- win10此计算机未连接到网络,win10提示无法连接到此网络是怎么回事 怎么办
- 【AIML系列-2】人工智能标记语言——初级标签教学
热门文章
- PMP-我是如何两周拿下5A的
- pyTest官方手册(Release 4.2)之蹩脚翻译(9)
- js 格式化prettier配置_使Prettier一键格式化WXSS
- css3 标点符号在首位,CSS 让标点符号不出现在行首
- 合肥工业大学计算机与信息学院复试,合肥工业大学计算机与信息学院2018考研大纲(复试)...
- USB-C PD接口DRP芯片功能介绍
- js 中按下键盘事件
- SpringBoot中Redis报错:NOAUTH Authentication required.; nested exception is redis.clients.jedis.exceptio
- 中小学计算机培训心得体会,中小学计算机管理员培训心得体会材料
- 山僧不识英雄主,何必晓晓问姓名