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

微服务的拆分和远程调用相关推荐

  1. 服务拆分和远程调用(微服务)

    博客主页:踏风彡的博客 博主介绍:一枚在学习的大学生,希望在这里和各位一起学习. 所属专栏:SpringCloud 文章创作不易,期待各位朋友的互动,有什么学习问题都可在评论区留言或者私信我,我会尽我 ...

  2. 【学习日记2023.6.9】之 SpringCloud入门(认识微服务_服务拆分和远程调用RestTemplate_Eureka注册中心_Ribbon负载均衡_Nacos注册中心)

    文章目录 SpringCloud 1. 认识微服务 1.1 单体架构 1.2 分布式架构 1.3 微服务 1.4 SpringCloud 1.5 总结 2. 服务拆分和远程调用 2.1 服务拆分原则 ...

  3. 【黑马-SpringCloud技术栈】【02】服务拆分及远程调用_服务提供者与消费者

    持续学习&持续更新中- 守破离 [黑马-SpringCloud技术栈][02]服务拆分及远程调用_服务提供者与消费者 SpringCloud引入 服务拆分及远程调用 服务拆分原则 服务拆分De ...

  4. Day02 - 服务拆分及远程调用

    服务拆分及远程调用 1.服务拆分 - 案例Demo 不说那么多,直接上代码 2.微服务远程调用 1.服务拆分 - 案例Demo 服务拆分注意事项 不同微服务,不要重复开发相同业务 微服务数据独立,不要 ...

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

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

  6. 【架构师实践课】微服务如何拆分?大型微服务项目从何下手?

    继上期[架构师实践课]单体和微服务怎么选?单体到微服务怎么转?之后,万老师为我们带来了微服务系统设计专题的第二个议题:微服务设计痛点. 以下内容根据实践课整理. 微服务如何拆分 首先想和大家分享的,就 ...

  7. 我的物联网项目(十五) 微服务业务拆分

    微服务架构无论从业务层面,还是技术层面,要思考和解决的问题很多,其中有三大问题只要用到了微服务架构就必须要面对的,那就是拆分,事务,和查询. 当初规划这个2.0平台用微服务架构本身的目的是将平台以业务 ...

  8. 【微服务】服务拆分和远程调用

    2.1 服务拆分原则 这里总结了微服务拆分时的几个原则: 不同微服务,不要重复开发相同业务 微服务数据独立,不要访问其它微服务的数据库 微服务可以将自己的业务暴露为接口,供其它微服务调用 2.2 服务 ...

  9. 微服务的服务拆分和远程调用

    2.1.服务拆分原则 这里我总结了微服务拆分时的几个原则: 不同微服务,不要重复开发相同业务 微服务数据独立,不要访问其它微服务的数据库 微服务可以将自己的业务暴露为接口,供其它微服务调用 2.2.服 ...

最新文章

  1. Access导入MDB文件
  2. 那些 别人家的孩子 ,后来都怎么样了 ?
  3. Java:用POI读写Excel
  4. 百度研究院商业智能实验室招聘研究实习生!
  5. anaconda 安装在c盘_Tensorflow 2.1安装
  6. How to remove k__BackingField from Json data
  7. 玩转MacBook的五个使用技巧
  8. JSP中使用的模式——JSP+Servlet+JavaBean
  9. TheFatRat自动化渗透工具
  10. XF660R型号良田高拍仪接口开发,通过图片文件的二进制数据进行图片上传
  11. 如何判断一个数是否为素数(质数)?
  12. 松翰单片机 c语言例程 宏定义出错,求助.松翰单片机 2714 用仿真器可以 , 但是烧到单片机不行. (amobbs.com 阿莫电子论坛)...
  13. 抽取modelnet40_ply_hdf5_2048数据集的子类集制作h5点云
  14. OCR目标识别(车辆VIN码识别效果)
  15. 微软数据中心将到南非!AWS也将要跟进
  16. INSERT INTO… ON DUPLICATE KEY UPDATE用法
  17. Linux Terminal 下工具栏显示设置
  18. 防火墙对FTP主动和被动模式的影响
  19. 〖Python零基础入门篇㊼〗- 包与模块
  20. LoadRunner性能测试结果分析样例

热门文章

  1. java组长竞选_竞选组长的发言稿8篇范本
  2. 值得推荐的C/C++框架和库,包含很多开源项目 (真的很强大)
  3. Python自制办公小工具(2、便签)
  4. 八个前端开发必备的面试刷题网站
  5. 先进的管理技术将其转化成为有机的、高效的商业模式的管理集成
  6. Android中okhttp原理详解
  7. jquery name高级选择器
  8. STUN/TURN/ICE协议在P2P SIP中的应用
  9. Matlab 结构体数组 基础知识 struct(自学文档)
  10. matlab 结构体数据(MWStructArray)读取到C#