微服务架构6种常用的设计模式
1、代理设计模式
![b34736d12bad05e7c14fc7fcd34d9ebf.png](https://i-blog.csdnimg.cn/blog_migrate/16bc2187ece40c921a9d8957aa50e2d1.jpeg)
2、聚合设计模式
![15e682f3d175f6f7f3a3e5a38d6553c3.png](https://i-blog.csdnimg.cn/blog_migrate/d1503453c6ca977121b12a84fb5bea00.jpeg)
3、链条设计模式
![1a8822f168882527b573914204ab7ff6.png](https://i-blog.csdnimg.cn/blog_migrate/fc2476bd436523ae64bde121f4e59c2d.jpeg)
4、聚合链条设计模式
![8d079c7e323e8b92c553b26b858fe7c9.png](https://i-blog.csdnimg.cn/blog_migrate/6e86eab226c755e9cc0d007198d5e029.jpeg)
5、数据共享设计模式
![7a2e66cb5a9fe527ce85db8e4a2e0220.png](https://i-blog.csdnimg.cn/blog_migrate/c7b91360a143619c06ef2c2dfa33e5aa.jpeg)
6、异步消息设计模式
![80842e1e6fce213b9010df29429297ad.png](https://i-blog.csdnimg.cn/blog_migrate/a7a8ead47c59b023134e88a6fc7b5ea7.jpeg)
案例
需求:
![03883ad27f993312dce62390ccf10aed.png](https://i-blog.csdnimg.cn/blog_migrate/54475563eaf08ba0fdfd8db84d1db7ba.jpeg)
数据库设计:略
mybatis逆向工程生成pojo实体类和mapper接口以及mapper映射文件。
先创建User服务,新建User-Service项目和User-Provider项目,添加依赖
User-Service:
![33289bab4361e0cfc63a57907cd39110.png](https://i-blog.csdnimg.cn/blog_migrate/cdee3550bfdca0a11f390c8221bd536c.png)
User-Provider:除了springcloud的依赖和springboot的web启动器之外还需要一下一些
![a22269eb62310647f925c05676db8978.png](https://i-blog.csdnimg.cn/blog_migrate/84bdd2486b61a65f13ddd74c3a777093.jpeg)
User-Service:将逆向工程生成的pojo实体类放入pojo包中,编写接口
![b1dec7664cebb235536d4fbda15a2426.png](https://i-blog.csdnimg.cn/blog_migrate/b6db29d29c93fec5d2a636e17ff708f2.png)
![9728cb1011cf276e9d3b6c72811daa7c.png](https://i-blog.csdnimg.cn/blog_migrate/6386e27dd00a97df5ce6a1756056d09a.png)
User-Provider:
配置文件:
![edfafb054612bb45fccbdbea20b6e7af.png](https://i-blog.csdnimg.cn/blog_migrate/a983e93ea7d84b3ed57bf6441abbd69f.jpeg)
将mapper映射文件放到classpath下
![8ea8aeae72c93fac69d096772287be9b.png](https://i-blog.csdnimg.cn/blog_migrate/798da5be5debac3fb1bce3a99217da60.png)
![fde388a2e1927cac66e5df6572f92eb0.png](https://i-blog.csdnimg.cn/blog_migrate/fe728d52b74fa8422fa411c853e7d88b.png)
新建一个ServiceImpl,但是不实现UserService的接口,而是使用mapper对数据库进行操作,然后新建controller,在这里面新建类,实现UserService接口,重写其中的方法,调用ServiceImpl中的方法,完成对User-Service的调用和对数据库的操作
启动类:
![afd0bd774c1f9148fa3417149de17b8f.png](https://i-blog.csdnimg.cn/blog_migrate/6a9b194148f74b93a3c1990f1105c110.png)
ServiceImpl:
![6d9df5eb3c44495d9c6de050cb9e3d3c.png](https://i-blog.csdnimg.cn/blog_migrate/ce4eb87dbe93fd80be84b39255279374.jpeg)
Controller:
![297d6956df2eb32b5df3f9a00d1a0684.png](https://i-blog.csdnimg.cn/blog_migrate/6075dc45cc6cceb0003260f7e408e53c.png)
其他Product、Order、Trade的操作和这个基本一样,只是业务逻辑稍微有些改变。
创建consumer:添加springcloud和feign,eureka,以及这几个服务的依赖等
![5351ef2400a7706baafd49c01f724179.png](https://i-blog.csdnimg.cn/blog_migrate/417af35694a11e687493cb20729918f0.png)
启动类:
![367d850b1ab196cf5f6db1abbc2a7128.png](https://i-blog.csdnimg.cn/blog_migrate/9c6e3eabe5c12f7f58b08e38d1db0bbb.png)
配置文件
![b83ca2d2cdb8f3ad626ee389c8b4db0a.png](https://i-blog.csdnimg.cn/blog_migrate/0774089650a0b1b6b7ea001f9aa7a4ee.png)
调用这几个服务的接口
![e2ec26a7d2d3193de06f2673b2a3f4a6.png](https://i-blog.csdnimg.cn/blog_migrate/a948613f461470c7f2aa7c7659d1bd32.png)
在controller中编写业务逻辑
package com.ebook.controller;
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.ebook.order.pojo.Orders;
import com.ebook.product.service.pojo.Product;
import com.ebook.service.ConsumerOrderService;
import com.ebook.service.ConsumerProductService;
import com.ebook.service.ConsumerTradeService;
import com.ebook.service.ConsumerUserService;
import com.ebook.user.pojo.User;
@RestController
public class ConsumerController {
@Autowired
private ConsumerOrderService orderService;
@Autowired
private ConsumerProductService productService;
@Autowired
private ConsumerTradeService tradeService;
@Autowired
private ConsumerUserService userService;
@RequestMapping(value="/create",method=RequestMethod.GET)
public User create(){
Integer result = login();
System.out.println(result);
User user = new User();
user.setUserName("结果请看控制台");
List<Product> productList = productService.findAll();
for (Product product : productList) {
System.out.println(product.getName());
}
List<Orders> orderList = orderService.findAll();
Orders order = orderList.get(0);
order.setId(777);
Orders addOrder = orderService.addOrder(order);
System.out.println("添加后的orderID:"+addOrder.getId());
return user;
}
public Integer login() {
String userName = "admin";
String password = "admin";
User user = userService.login(userName, password);
if(user!=null) {
System.out.println("登录成功");
return user.getId();
}
System.out.println("登录失败");
return -1;
}
}
链式调用,即使用consumer调用trade服务,在trade服务中调用order服务,在provider中调用provider和在consumer服务中调用provider服务步骤是一样的。
pojo实体类要实现序列化接口。