• 编写服务提供者
  • 编写服务消费者

微服务构建的是分布式系统,各个微服务之间通过网络进行通信。一般我们用服务提供者和服务消费者来描述微服务之间的调用关系:

服务提供者

服务被调用方

服务消费者

服务的调用方

以售票系统为例,用户向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之服务提供者和服务消费者相关推荐

  1. SpringCloud 教程 | 第二篇: 服务消费者(rest+ribbon)

    转载请标明出处: blog.csdn.net/forezp/arti- 本文出自方志朋的博客 在上一篇文章,讲了服务的注册和发现.在服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于h ...

  2. 服务提供者与服务消费者

    服务提供者和服务消费者,名词非常的高大上,但是其实很简单,我们看什么是服务提供者,什么是服务消费者,服务的被调用方是服务的提供者,服务的调用方是消费者,以我们之前的电影系统为例,一个用户发起了购票的请 ...

  3. 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

    转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc02-rest-ribbon/ 本文出自方志朋的博客 最新Finchley版 ...

  4. Dubbo搭建HelloWorld-搭建服务提供者与服务消费者并完成远程调用(附代码下载)

    场景 Dubbo简介与基本概念: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555224 Dubbo环境搭建-ZooKe ...

  5. 源码分析Dubbo前置篇-寻找注册中心、服务提供者、服务消费者功能入口

    本节主要阐述如下两个问题:  1.Dubbo自定义标签实现.  2.dubbo通过Spring加载配置文件后,是如何触发注册中心.服务提供者.服务消费者按照Dubbo的设计执行相关的功能.  所谓的执 ...

  6. Spring Cloud服务提供者与服务消费者怎么运作的?

    在微服务中最基本最基本的两个角色是服务提供者与服务消费者. 之前所有代码都在同一个框架的时候,比如Controller调用Service的,直接注入Service bean即可进行调用了.现在做成微服 ...

  7. Spring Cloud(四)服务提供者 Eureka + 服务消费者 Feign

    上一篇文章,讲述了如何通过RestTemplate + Ribbon去消费服务,这篇文章主要讲述如何通过Feign去消费服务. Feign简介 Feign是一个声明式的伪Http客户端,它使得写Htt ...

  8. Spring Cloud(三)服务提供者 Eureka + 服务消费者(rest + Ribbon)

    Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具.它是一个基于HTTP和TCP的客户端负载均衡器.它可以通过在客户端中配置ribbonServer ...

  9. nacos项目搭建(服务提供者,服务消费者)

    spring cloud ablibaba 版本说明 https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明 启动nacos服务 官网: h ...

  10. Spring Cloud【Finchley】-01服务提供者与服务消费者

    文章目录 Spring Cloud总览 概述 示例 场景描述 用户微服务 新建Spring Boot服务 项目结构 用户库表 Model Dao层 Service Controller 暴露Rest ...

最新文章

  1. 暑期集训1:C++STL 练习题B:HDU-1004
  2. j2ee html5,HTML5+J2EE实现文件异步上传
  3. 防屏蔽浏览器_彻底解决安卓手机通知管理难题,顺便还实现了聊天消息防撤回!...
  4. 神策数据简宁:如何更好地借助数据驱动产品价值提升?
  5. 小编带你了解oracle使用索引和不使用索引性能分析
  6. hp-ux mysql_HP-UX安装MySQL
  7. NGUI如何创建自己的精灵图集
  8. php strtoupper 和 array_change_key_case 字符串转大写,小写
  9. com 名字对象(3)使用IMoniker
  10. numpy常用函数(更新中)
  11. 【推荐实践】信息流推荐在凤凰新闻的业务实践
  12. 清华大学操作系统OS学习(二)——OS基本概念
  13. Tp 引入 simple_html_dom.php
  14. 迁移linux系统到新硬盘
  15. 微信好友只有昵称没有微信号_为什么有些好友名片有显示微信号,有些却没有,怎么回事?急...
  16. hdwiki下model目录功能
  17. 13.请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。
  18. MTK平台 SIM双卡改成单卡修改
  19. win10此计算机未连接到网络,win10提示无法连接到此网络是怎么回事 怎么办
  20. 【AIML系列-2】人工智能标记语言——初级标签教学

热门文章

  1. PMP-我是如何两周拿下5A的
  2. pyTest官方手册(Release 4.2)之蹩脚翻译(9)
  3. js 格式化prettier配置_使Prettier一键格式化WXSS
  4. css3 标点符号在首位,CSS 让标点符号不出现在行首
  5. 合肥工业大学计算机与信息学院复试,合肥工业大学计算机与信息学院2018考研大纲(复试)...
  6. USB-C PD接口DRP芯片功能介绍
  7. js 中按下键盘事件
  8. SpringBoot中Redis报错:NOAUTH Authentication required.; nested exception is redis.clients.jedis.exceptio
  9. 中小学计算机培训心得体会,中小学计算机管理员培训心得体会材料
  10. 山僧不识英雄主,何必晓晓问姓名