微服务的拆分和远程调用
1、服务拆分原则
- 不同微服务,不要重复开发相同业务
- 微服务数据独立,不要访问其它微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其它微服务调用
2、服务拆分示例
cloud-demo:父工程,管理依赖
- order-service:订单微服务,负责订单相关业务
- user-service:用户微服务,负责用户相关业务
要求:
- 订单微服务和用户微服务都必须有各自的数据库,相互独立
- 订单服务和用户服务都对外暴露Restful的接口
- 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库
2.1、导入sql语句
cloud-order 数据
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for tb_order
-- ----------------------------
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单id',`user_id` bigint(20) NOT NULL COMMENT '用户id',`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '商品名称',`price` bigint(20) NOT NULL COMMENT '商品价格',`num` int(10) NULL DEFAULT 0 COMMENT '商品数量',PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `username`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;-- ----------------------------
-- Records of tb_order
-- ----------------------------
INSERT INTO `tb_order` VALUES (101, 1, 'Apple 苹果 iPhone 12 ', 699900, 1);
INSERT INTO `tb_order` VALUES (102, 2, '雅迪 yadea 新国标电动车', 209900, 1);
INSERT INTO `tb_order` VALUES (103, 3, '骆驼(CAMEL)休闲运动鞋女', 43900, 1);
INSERT INTO `tb_order` VALUES (104, 4, '小米10 双模5G 骁龙865', 359900, 1);
INSERT INTO `tb_order` VALUES (105, 5, 'OPPO Reno3 Pro 双模5G 视频双防抖', 299900, 1);
INSERT INTO `tb_order` VALUES (106, 6, '美的(Midea) 新能效 冷静星II ', 544900, 1);
INSERT INTO `tb_order` VALUES (107, 2, '西昊/SIHOO 人体工学电脑椅子', 79900, 1);
INSERT INTO `tb_order` VALUES (108, 3, '梵班(FAMDBANN)休闲男鞋', 31900, 1);SET FOREIGN_KEY_CHECKS = 1;
cloud-user 数据
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '收件人',`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 109 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES (1, '柳岩', '湖南省衡阳市');
INSERT INTO `tb_user` VALUES (2, '文二狗', '陕西省西安市');
INSERT INTO `tb_user` VALUES (3, '华沉鱼', '湖北省十堰市');
INSERT INTO `tb_user` VALUES (4, '张必沉', '天津市');
INSERT INTO `tb_user` VALUES (5, '郑爽爽', '辽宁省沈阳市大东区');
INSERT INTO `tb_user` VALUES (6, '范兵兵', '山东省青岛市');SET FOREIGN_KEY_CHECKS = 1;
2.2、导入工程
父工程pom.xml
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version><relativePath/>
</parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><mapper.starter.version>2.0.2</mapper.starter.version><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR10</spring-cloud.version><mysql.version>5.1.47</mysql.version><mybatis.version>2.1.1</mybatis.version></properties><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.6.RELEASE</version><type>pom</type><scope>import</scope></dependency><!-- 通用Mapper启动器 --><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>${mapper.starter.version}</version></dependency><!-- springCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
order-service pom.xml文件依赖如下:
<dependencies>
<dependency><groupId>org.springframework.boot</groupId><artifactId>springbootstarterweb</artifactId>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysqlconnectorjava</artifactId>
</dependency><!--mybatis依赖-->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatisspringbootstarter</artifactId>
</dependency><!--eureka客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>springcloudstarternetflixeurekaclient</artifactId>
</dependency>><!--nacos客户端依赖包-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>springcloudstarteralibabanacosdiscovery</artifactId>
</dependency><!--feign客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>springcloudstarteropenfeign</artifactId>
</dependency><!--引入HttpClient依赖-->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feignhttpclient</artifactId>
</dependency><!--引入feign的统一api--><dependency><groupId>cn.itcast.demo</groupId><artifactId>feignapi</artifactId><version>1.0</version></dependency></dependencies><build><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>springbootmavenplugin</artifactId></plugin></plugins>
</build>
user-service pom.xml文件依赖如下:
<dependencies><dependency><groupId>cn.itcast.demo</groupId><artifactId>feign-api</artifactId><version>1.0</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><!--nacos配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
</dependencies>
<build><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
3、实现远程调用案例
order-service工程框架
OrderMapper接口
package cn.itcast.order.mapper;
import com.czxy.feign.pojo.Order;
import tk.mybatis.mapper.common.Mapper;public interface OrderMapper extends Mapper<Order> {}
Order类
package cn.itcast.order.pojo;import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;@Data
@Table(name = "tb_order")
public class Order {@Idprivate Integer id;@Column(name = "user_id")private Integer userId;private String name;private BigDecimal price;private Integer num;private User user;
}
OrderService
package cn.itcast.order.service;import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;/*@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.利用RestTemplate发起http请求,查询用户// 2.1.url路径String url = "http://userservice/user/" + order.getUserId();// 2.2.发送http请求,实现远程调用User user = restTemplate.getForObject(url, User.class);// 3.封装user到Orderorder.setUser(user);// 4.返回return order;}*/
}
OrderController
package cn.itcast.order.web;import cn.itcast.order.service.OrderService;
import com.czxy.feign.pojo.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/order")
@CrossOrigin
public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("list")public List<Order> list(){List<Order> list = orderService.list();return list;}
}
OrderApplication
package cn.itcast.order;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import tk.mybatis.spring.annotation.MapperScan;@EnableFeignClients(basePackages = "com.czxy.feign.client")
@SpringBootApplication
@MapperScan(value = "cn.itcast.order.mapper")
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Bean//负载均衡@LoadBalancedpublic RestTemplate restTemplate(RestTemplateBuilder builder) {return builder.build();}
}
application.yml
server:port: 8080
spring:application:name: orderservicedatasource:url: jdbc:mysql://localhost:3306/ssm_vue?useSSL=falseusername: rootpassword: 1234driver-class-name: com.mysql.jdbc.Drivercloud:nacos:server-addr: localhost:8848 # Nacos地址 单机
user-service工程结构
UserMapper接口
package cn.itcast.user.mapper;import com.czxy.feign.pojo.User;
import tk.mybatis.mapper.common.Mapper;public interface UserMapper extends Mapper<User> {}
UserService
package cn.itcast.user.service;import cn.itcast.user.mapper.UserMapper;
import com.czxy.feign.client.UserClient;import com.czxy.feign.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService implements UserClient {@Autowiredprivate UserMapper userMapper;@Overridepublic User selectByUid(Integer uid) {User user = userMapper.selectByPrimaryKey(uid);return user;}
}
UserController
package cn.itcast.user.web;import cn.itcast.user.service.UserService;
import com.czxy.feign.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@Slf4j
@RestController
@RequestMapping("/user")
@CrossOrigin
//@RefreshScope
public class UserController {@Autowiredprivate UserService userService;@GetMapping("{uid}")public User selectByUid(@PathVariable Integer uid) {return userService.selectByUid(uid);}
}
UserApplication
package cn.itcast.user;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;@SpringBootApplication
@MapperScan(value = "cn.itcast.user.mapper")
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}
application.yml
server:port: 8081
spring:application:name: userservicedatasource:url: jdbc:mysql://localhost:3306/ssm_vue?useSSL=falseusername: rootpassword: 1234driver-class-name: com.mysql.jdbc.Drivercloud:nacos:server-addr: localhost:8848 # Nacos地址单机
mybatis:type-aliases-package: com.czxy.feign.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
微服务的拆分和远程调用相关推荐
- 服务拆分和远程调用(微服务)
博客主页:踏风彡的博客 博主介绍:一枚在学习的大学生,希望在这里和各位一起学习. 所属专栏:SpringCloud 文章创作不易,期待各位朋友的互动,有什么学习问题都可在评论区留言或者私信我,我会尽我 ...
- 【学习日记2023.6.9】之 SpringCloud入门(认识微服务_服务拆分和远程调用RestTemplate_Eureka注册中心_Ribbon负载均衡_Nacos注册中心)
文章目录 SpringCloud 1. 认识微服务 1.1 单体架构 1.2 分布式架构 1.3 微服务 1.4 SpringCloud 1.5 总结 2. 服务拆分和远程调用 2.1 服务拆分原则 ...
- 【黑马-SpringCloud技术栈】【02】服务拆分及远程调用_服务提供者与消费者
持续学习&持续更新中- 守破离 [黑马-SpringCloud技术栈][02]服务拆分及远程调用_服务提供者与消费者 SpringCloud引入 服务拆分及远程调用 服务拆分原则 服务拆分De ...
- Day02 - 服务拆分及远程调用
服务拆分及远程调用 1.服务拆分 - 案例Demo 不说那么多,直接上代码 2.微服务远程调用 1.服务拆分 - 案例Demo 服务拆分注意事项 不同微服务,不要重复开发相同业务 微服务数据独立,不要 ...
- Dubbo搭建HelloWorld-搭建服务提供者与服务消费者并完成远程调用(附代码下载)
场景 Dubbo简介与基本概念: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555224 Dubbo环境搭建-ZooKe ...
- 【架构师实践课】微服务如何拆分?大型微服务项目从何下手?
继上期[架构师实践课]单体和微服务怎么选?单体到微服务怎么转?之后,万老师为我们带来了微服务系统设计专题的第二个议题:微服务设计痛点. 以下内容根据实践课整理. 微服务如何拆分 首先想和大家分享的,就 ...
- 我的物联网项目(十五) 微服务业务拆分
微服务架构无论从业务层面,还是技术层面,要思考和解决的问题很多,其中有三大问题只要用到了微服务架构就必须要面对的,那就是拆分,事务,和查询. 当初规划这个2.0平台用微服务架构本身的目的是将平台以业务 ...
- 【微服务】服务拆分和远程调用
2.1 服务拆分原则 这里总结了微服务拆分时的几个原则: 不同微服务,不要重复开发相同业务 微服务数据独立,不要访问其它微服务的数据库 微服务可以将自己的业务暴露为接口,供其它微服务调用 2.2 服务 ...
- 微服务的服务拆分和远程调用
2.1.服务拆分原则 这里我总结了微服务拆分时的几个原则: 不同微服务,不要重复开发相同业务 微服务数据独立,不要访问其它微服务的数据库 微服务可以将自己的业务暴露为接口,供其它微服务调用 2.2.服 ...
最新文章
- Access导入MDB文件
- 那些 别人家的孩子 ,后来都怎么样了 ?
- Java:用POI读写Excel
- 百度研究院商业智能实验室招聘研究实习生!
- anaconda 安装在c盘_Tensorflow 2.1安装
- How to remove k__BackingField from Json data
- 玩转MacBook的五个使用技巧
- JSP中使用的模式——JSP+Servlet+JavaBean
- TheFatRat自动化渗透工具
- XF660R型号良田高拍仪接口开发,通过图片文件的二进制数据进行图片上传
- 如何判断一个数是否为素数(质数)?
- 松翰单片机 c语言例程 宏定义出错,求助.松翰单片机 2714 用仿真器可以 , 但是烧到单片机不行. (amobbs.com 阿莫电子论坛)...
- 抽取modelnet40_ply_hdf5_2048数据集的子类集制作h5点云
- OCR目标识别(车辆VIN码识别效果)
- 微软数据中心将到南非!AWS也将要跟进
- INSERT INTO… ON DUPLICATE KEY UPDATE用法
- Linux Terminal 下工具栏显示设置
- 防火墙对FTP主动和被动模式的影响
- 〖Python零基础入门篇㊼〗- 包与模块
- LoadRunner性能测试结果分析样例
热门文章
- java组长竞选_竞选组长的发言稿8篇范本
- 值得推荐的C/C++框架和库,包含很多开源项目 (真的很强大)
- Python自制办公小工具(2、便签)
- 八个前端开发必备的面试刷题网站
- 先进的管理技术将其转化成为有机的、高效的商业模式的管理集成
- Android中okhttp原理详解
- jquery name高级选择器
- STUN/TURN/ICE协议在P2P SIP中的应用
- Matlab 结构体数组 基础知识 struct(自学文档)
- matlab 结构体数据(MWStructArray)读取到C#