使用ONE.Abp快速开发微服务,再也不用加班了
Posted 大大世界有你在
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ONE.Abp快速开发微服务,再也不用加班了相关的知识,希望对你有一定的参考价值。
项目背景
公司采用项目制工作方式,因此在不同项目上可能存在多个团队开发独立的代码库,但通用的基础设施却是相同的,这可能导致每个项目都需要编写相同的代码,并重复造轮子。更严重的是,每个项目都有自己的用户体系,导致用户在使用不同的服务时需要重新登录,这不仅会破坏用户的体验,也不利于项目的维护和数据的积累。同时前端也会基于不同项目开发不同的网站,为了解决这些问题, ONEAbp项目由此诞生。
项目介绍
ONE.Abp是一款基于 Abp Vnext 框架开发的全流程解决方案,旨在帮助开发者快速构建微服务应用。它提供了基础模块和构建工具,让开发者可以专注于业务逻辑的实现,而无需花费大量时间和精力在框架的选择、配置和集成上。
快速开始
首先,如果你没有安装ONEABP CLI,请先安装它:
dotnet tool install -g ONE.Abp.Cli
在一个空文件夹使用 abp new
命令创建新解决方案:
base模板
oneabp new Acme.BookStore -t base -d ef -dbms postgresql
micro模板
oneabp new Acme.BookStore -t micro -d ef -dbms postgresql
ONEABP.CLI在ABP.CLI基础上增加了两个模板
- base模板: 解决方案包含网关,认证服务和基础服务项目
- micro模板:解决方案包含微服务项目
oneabp new 命令使用
Usage: oneabp new <project-name> [options] Options: -t|--template <template-name> (default: base) -d|--database-provider <database-provider> (if supported by the template) -o|--output-folder <output-folder> (default: current folder) -v|--version <version> (default: latest version) -cs|--connection-string <connection-string> (your database connection string) --dbms <database-management-system> (your database management system) Examples: oneabp new Acme.BookStore -t base -d ef -dbms postgresql oneabp new Acme.BookStore -t micro -d ef -dbms postgresql oneabp new Acme.BookStore -t micro --connection-string "Server=myServerName\\myInstanceName;Database=myDatabase;User Id=myUsername;Password=myPassword"
利用base模板创建的项目生成的目录结构如下
+---aspnet-core | +---gateways | | \\---Acme.BookStore.Gateway //网关 | +---src | | +---Acme.BookStore.Application | | +---Acme.BookStore.AuthServer //认证服务 | | +---Acme.BookStore.DbMigrator //迁移项目 | | +---Acme.BookStore.Domain | | +---Acme.BookStore.Domain.Shared | | +---Acme.BookStore.EntityFrameworkCore | | +---Acme.BookStore.HttpApi | | +---Acme.BookStore.HttpApi.Client | | \\---Acme.BookStore.HttpApi.Host //基础服务 | \\---test | +---Acme.BookStore.Application.Tests | +---Acme.BookStore.Domain.Tests | +---Acme.BookStore.EntityFrameworkCore.Tests | +---Acme.BookStore.HttpApi.Client.ConsoleTestApp | \\---Acme.BookStore.TestBase \\---vue +---public +---src | +---api | +---assets | +---components | +---directive | +---layout | +---libs | +---plugins | +---router | +---store | | \\---modules | +---utils | \\---views | +---error | +---file //文件管理 | +---login | +---redirect | +---sass | | +---sale //销售版本管理 | | \\---tenant //租户管理 | \\---system | +---application //应用管理 | +---dept //部门管理 | +---dict //字典管理 | +---menu //菜单管理 | +---permis | | \\---components | +---role //角色管理 | +---setting //设置管理 | | \\---components | \\---user //用户管理 | \\---profile \\---vite
使用
后端
1.更换连接字符串
用Base模板创建后,进入后端项目修改连接字符串,base项目使用了两个数据库,一个是当前基础服务的数据库,另外一个是共享库,用于存储权限,设置,字典和数据权限等数据。
2.迁移项目 运行xxxx.DbMigrator
3.运行网关,认证服务,基础服务。
前端
1.安装依赖 命令:yarn install
2.运行服务 命令:yarn dev
Base模板创建项目已经包含了基础的服务模块,如租户管理,用户管理,角色管理,字典管理等...现在你可以专注于开发你的业务微服务了。
利用micro版本创建项目目录结构如下:
+---aspnet-core
| +---src
| | +---Acme.BookStore.Application
| | +---Acme.BookStore.DbMigrator //迁移项目
| | +---Acme.BookStore.Domain
| | +---Acme.BookStore.Domain.Shared
| | +---Acme.BookStore.EntityFrameworkCore
| | +---Acme.BookStore.HttpApi
| | +---Acme.BookStore.HttpApi.Client
| | \\---Acme.BookStore.HttpApi.Host //基础服务
| \\---test
| +---Acme.BookStore.Application.Tests
| +---Acme.BookStore.Domain.Tests
| +---Acme.BookStore.EntityFrameworkCore.Tests
| +---Acme.BookStore.HttpApi.Client.ConsoleTestApp
| \\---Acme.BookStore.TestBase
最后
更多内容请查看在线文档
项目地址:sososu/ONEAbp (github.com)
ABPVNEXT框架 QQ交流群:655362692
教你3分钟快速开发微信公众号[订阅号][服务号]
Wx-tools是基于微信公众平台API的轻量级框架。 基于Wx-tools你可以开速开发一个订阅号/服务号的web应用后台。
做过几个基于微信公众平台API的项目,感觉操作太繁琐,有时微信官方开发文档还有错!!
所以!wx-tools诞生了!
看过很多优秀的开源代码,特别是chanjarster的代码,优秀的设计思想让我迷糊灌顶。
不多说,让我带你快速有效可拓展的开发一个订阅号/服务号的后台。
到底有多简单?只需要3步即可~
1. 创建web工程,添加jar包及依赖
2. 初始化WxConfigStorage 配置库和WxService(微信API调用接口)
3. 实现业务逻辑即可
如果有过开发过基于微信公众平台API项目的小伙伴们,应该很容易上手哦!没有也没关系,戳这里看看官方文档入门
开始
一、创建web工程,添加jar包及依赖
我这里使用的是maven构建项目,可以在eclipse创建web项目。
maven创建项目指令
mvn archetype:generate -DgroupId=wxtools.demo -DartifactId=demo -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=local
- 注意:此指令创建的web工程版本是2.3的,比较低。可以修改web.xml,变成3.0
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>demo</display-name>
</web-app>
创建完毕后,导入wx-tools-1.0.0.jar
- 注意,导入后记得修改jar包的编码。window下默认读GBK,而框架本身是UTF-8。如果需要看源代码的务必手动修改编码。
- 修改方式:在eclipse的工程下,对着jar包右键 –> Properties –> Encoding –> UTF-8
建立基本的package,如图。
添加wx-tools依赖的jar包。
- 如果使用maven构建项目,可以直接添加如下坐标下载依赖jar。
maven pom.xml
<!-- HttpClient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.6</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.3.6</version>
</dependency>
<!-- JSON -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- XML -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
<!-- IO -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
如果不是maven构建的项目,可以自行下载相应的jar包,放在WEB-INF/lib文件夹下
二、初始化WxConfigStorage 配置库和WxService
本Demo采取的初始化策略是实现ServletContextListener接口,当tomcat启动时,会初始化配置。
当然,如果web项目是由spring管理。也可以添加相应的Bean去加载初始化。这里就不多说了。
- 创建类实现ServletContextListener接口
/**
* 初始化配置库和微信API服务
* @author antgan
*/
public class DemoInitListener implements ServletContextListener {
//配置库
private WxConfigStorage config = null;
//API Service
private WxService wxService = null;
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("------实例化config和service----------");
//调用默认基于内存的配置库WxInMemoryConfigStorage的getInstance获得实例。注意这里是单例模式
config = WxInMemoryConfigStorage.getInstance();
//设置AppId
config.setAppId("wxb1bff1627d37417b");
//设置AppSecret
config.setAppSecret("dd037d9b9b4eea00fba14167a9f3c75d");
//设置token
config.setToken("antgan");
//设置临时资源文件存放路径
config.setTmpDirFile(new File("e://test"));
//设置永久资源文件存放路径
config.setMaterialDirFile(new File("e://test"));
//获得WxService实例。注意这里也是调用getInstance()方法获取唯一的业务对象。
wxService = WxServiceImpl.getInstance();
//注入配置库
wxService.setWxConfigStorage(config);
}
public void contextDestroyed(ServletContextEvent arg0) {
//...
}
}
- web.xml指定tomcat容器启动时执行该类
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>demo</display-name>
<listener>
<display-name>DemoInitListener</display-name>
<listener-class>wxtools.demo.init.DemoInitListener</listener-class>
</listener>
</web-app>
初始化配置库和注册服务已经ok了
三、实现业务逻辑
- 我们模拟一个业务场景:某公众平台进行一项活动,只有关注本公众号有奖竞猜一个单词,回答正确的用户会接收到平台回复“恭喜你中奖了”。正确答案是:smart
这里有必要介绍一下wx-tools的四大组件。
- WxMessageRouter 消息路由器
- WxMessageMatcher(接口) 消息匹配器
- WxMessageInterceptor (接口) 消息拦截器
- WxMessageHandler (接口) 消息处理器
这四大组件构成了对微信服务器发送过来的消息进行拓展性的处理。
其中,以上三个是接口,开发者可实现并构建自己的匹配器,拦截器,处理器。
此外,还有几个类需要注意一下
- WxConsts 类
- 封装所有微信公众平台API的常量类型,包括接口请求路径,事件等。
- WxConfigStorage 接口
- 基本配置库。里面包含了AppId,AppSecret等信息。wx-tools已经提供了个基于内存管理的配置库WxInMemoryConfigStorage。开发者可以直接使用该类作为程序的配置库,亦或者自行实现WxConfigStorage接口,构建自己的持久化配置库,注意:配置库对于整个程序是单例的。
- WxService 接口
- 微信API Service,所有接口都从这里调用。实现类为WxServiceImpl。注意:WxServiceImpl对于整个程序是单例的。
- WxMessageDuplicateChecker 接口
- 消息重复检查器。默认的实现类 WxMessageInMemoryDuplicateChecker,如有有需要开发者可自行实现消息检查。
- WxErrorException 类
- 微信异常
- WxErrorExceptionHandler 接口
- 开发者可自行实现该接口,处理微信异常。
理清了关系后,开始创建自定义匹配器Matcher
1. 创建DemoMatcher.Java 实现 WxMessageMatcher接口
任务:识别是英文字母的消息,如果是,接收;否则,不接受。
/**
* Demo 简单的匹配器,可以用于更加复杂的消息验证操作
* @author antgan
*/
public class DemoMatcher implements WxMessageMatcher{
//答案是smart,如果匹配smart返回true;反之,false。
public boolean match(WxXmlMessage message) {
if(message.getContent().equals("smart")){
return true;
}
return false;
}
}
2. 创建DemoInterceptor.java 实现 WxMessageInterceptor接口
任务:拦截消息,验证用户条件,需要满足关注3天以上。
/**
* Demo 拦截器,可以做身份验证,权限验证等操作。
* @author antgan
*/
public class DemoInterceptor implements WxMessageInterceptor{
public boolean intercept(WxXmlMessage wxMessage, Map<String, Object> context, WxService wxService)
throws WxErrorException {
//可以使用wxService的微信API方法
//可以在Handler和Interceptor传递消息,使用context上下文
//可以实现自己的业务逻辑
//这里就不编写验证关注三天以上的用户了
if(/*用户关注时长大于3天*/){
return true;
}
return false;
}
}
3. 创建类DemoMessageHandler.java 实现 WxMessageHandler接口
任务:如果满足以上条件的用户消息,返回字符串“恭喜你中奖了”
/**
* Demo 处理微信消息Handler
* @author antgan
*/
public class DemoMessageHandler implements WxMessageHandler {
//wxMessage 消息 | context 上下文 | WxService API对象
public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, WxService wxService) throws WxErrorException {
WxXmlOutMessage xmlOutMsg = null;
//必须以build()作为结尾,否则不生效。
if(wxMessage.getMsgType().equals(WxConsts.XML_MSG_TEXT)){
xmlOutMsg = WxXmlOutMessage.TEXT().content("恭喜你中奖了").toUser(wxMessage.getFromUserName()).fromUser(wxMessage.getToUserName()).build();
}
return xmlOutMsg;
}
}
4. 创建servlet,名为DemoServlet.java
任务:接收微信服务器发来的消息,并传入路由器中。
/**
* DemoServlet
* 接收微信服务器请求
* @author antgan
*/
@WebServlet("/wx")
public class DemoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private WxConfigStorage config;
private WxService service;
//获取配置库和Service实例
public DemoServlet() {
config = WxInMemoryConfigStorage.getInstance();
service = WxServiceImpl.getInstance();
service.setWxConfigStorage(config);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//验证服务器的有效性
PrintWriter out = response.getWriter();
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
if(WxServiceImpl.getInstance().checkSignature(signature, timestamp, nonce, echostr)){
out.print(echostr);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//返回消息给微信服务器
PrintWriter out = null;
try {
out = response.getWriter();
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//微信服务器推送过来的消息是XML格式。使用XStreamTransformer来反序列成WxXmlMessage对象
WxXmlMessage wx=XStreamTransformer.fromXml(WxXmlMessage.class, request.getInputStream());
System.out.println("消息:\n "+wx.toString());
//实例化一个路由器,理论上路由器在整个程序中只有一个。路由规则可以有多个。
WxMessageRouter router = new WxMessageRouter(WxServiceImpl.getInstance());
//添加规则;这里的规则是指,只接收TEXT类型,同步接收,交给DemoMatcher处理,交给DemoInterceptor处理,交给DemoMessageHandler处理
//注意!!每一个规则,必须由end()或者next()结束。不然不会生效。
//end()是指消息进入该规则后不再进入其他规则。 而next()是指消息进入了一个规则后,如果满足其他规则也能进入,处理。
router.rule().msgType(WxConsts.XML_MSG_TEXT).async(false).matcher(new DemoMatcher()).interceptor(new DemoInterceptor()).handler(new DemoMessageHandler()).end();
//把消息传递给路由器进行处理,返回值是WxXmlMessage的子类或者null
xmlOutMsg = router.route(wx);
if(xmlOutMsg!=null)
out.print(xmlOutMsg.toXml());//返回给用户。
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
}
就是这么简单。
完成了这个活动的业务。
最后,这个框架未实现JS-SDK相关接口。如果需要支付等接口,可以wx-tools内置的http相关接口实现。依然很简单。
以上是关于使用ONE.Abp快速开发微服务,再也不用加班了的主要内容,如果未能解决你的问题,请参考以下文章
springboot集成mybatis环境搭建以及实现快速开发微服务商品模块基本的增删改查!