# d7c_dubbo **Repository Path**: d7c/d7c_dubbo ## Basic Information - **Project Name**: d7c_dubbo - **Description**: d7c_dubbo 项目是基于 d7c_plugins 和 dubbo 2.6.6 开发的强权限校验、高可扩展性的分布式与微服务骨架项目。 - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: http://www.d7c.top/ - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-12-05 - **Last Updated**: 2024-09-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # d7c_dubbo ## 介绍 d7c_dubbo 项目是基于 d7c_plugins 和 dubbo 2.6.6 开发的强权限校验、高可扩展性的分布式与微服务骨架项目。 ## 软件架构 d7c_dubbo 采用 Maven 进行项目构建系统,支持 JDK1.8+、MySQL5.7/8+。该项目需要依赖 d7c_plugins 插件,如需源码请前往 [d7c_plugins](https://gitee.com/d7c/d7c_plugins),如需运维文档请前往 [d7c_docs](https://item.taobao.com/item.htm?ft=t&id=637839200595)。 ## 安装教程 1. 克隆项目到本地 2. 导入开发工具,获取 [开发工具](https://pan.baidu.com/s/1bNUzfSV7d-kQdXC5tkl-FA),提取码:7777 ## 模块介绍 ### 1. d7c_dubbo_core 该模块用于封装一些公共常量、实体类、枚举类、服务方法等。 ### 2. d7c_dubbo_common 该模块用于存放实体类、Dao 接口、Mapper.xml 定义等不被修改的通用代码。 ### 3. d7c_dubbo_interfaces 该模块用于存放对外提供服务的接口。 ### 4. d7c_dubbo_services_task 该模块为集群模式定时任务模块,不对外提供服务,只用于运行其他服务插入数据库(或消息队列)中的定时任务或本类定义的定时任务。 ### 5. d7c_dubbo_services_web 该模块为 dubbo 技术对外提供服务的生产者,对外提供 RPC 服务。 ### 6. d7c_dubbo_mock 该模块为 dubbo 消费者的降级服务实现模块。 ### 7. d7c_dubbo_client_api 该模块是一个 dubbo 消费者,基于 netty 实现的对外提供 HTTP Rest 服务,支持拦截器配置功能,拦截器可以使用无状态 token 中的信息实现权限校验。 ### 8. d7c_dubbo_client_rest 该模块是一个 dubbo 消费者,基于 SpringMVC 实现的 HTTP Rest 服务。 ### 9. d7c_dubbo_client_rpc 该模块是一个 dubbo 消费者,基于 netty 实现的对外提供 RPC 服务,同时通过独特的技术使开发 RPC 程序像开发普通 WEB 程序一样简单。 ``` package top.d7c.dubbo.client.controllers.sys; import java.util.Collection; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.Resource; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import top.d7c.dubbo.client.controllers.Module; import top.d7c.dubbo.client.controllers.RpcController; import top.d7c.dubbo.services.service.sys.SysUserService; import top.d7c.plugins.core.ObjectSerializaUtil; import top.d7c.plugins.netty.rpc.Request; import top.d7c.plugins.netty.rpc.Response; import top.d7c.plugins.netty.rpc.local.LocalSessionImpl; import top.d7c.plugins.netty.rpc.local.LocalSessionUtil; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; @RestController @RequestMapping(value = Module.TEST) public class TestController extends RpcController { /** * d7c 系统_用户表 Service */ @Resource(name = "sysUserServiceImpl") private SysUserService sysUserService; private Timer timer; private static AtomicLong atomic = new AtomicLong(0); @RequestMapping(value = Module.TEST_1) public Response test1(ChannelHandlerContext ctx, Request request) { System.out.println(sysUserService); Channel channel = ctx.channel(); LocalSessionUtil.getInstance().createSession(atomic.incrementAndGet(), channel, channel.id().asLongText()); Object object = ObjectSerializaUtil.getObject(request.getData()); if (timer == null) { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { send(request); } }, 1000, // 任务创建 1 秒后开始执行第一次 10000); // 每隔 10 秒执行一次 } return Response.ok(request, "服务端已收到{" + object + "}"); } public void send(Request request) { Collection allOnLines = LocalSessionUtil.getInstance().getAllOnLines(); System.out.println("allOnLines=======>" + allOnLines.toString()); for (LocalSessionImpl session : allOnLines) { Long attrId = session.getAttrId(); session.write(Response.ok(request, "您绑定的 attrId 为:" + attrId + ", object 为:" + session.getObject())); } } } ``` ### 10. d7c_dubbo_client_web 该模块是一个 dubbo 消费者,基于 SpringMVC 实现的 WEB 客户端管理模块。权限校验采用 Shiro 技术,页面解析采用 JSP 技术,页面展示采用 bootstrap 框架。 ### 11. d7c_dubbo_client_websocket 该模块是一个 dubbo 消费者,基于 netty 实现的对外提供 Websocket 服务,同时通过独特的技术使开发 Websocket 程序像开发普通 WEB 程序一样简单。 ``` package top.d7c.dubbo.client.controllers.sys; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.Timer; import java.util.TimerTask; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import top.d7c.dubbo.client.controllers.WebSocketController; import top.d7c.plugins.core.PageData; import top.d7c.plugins.core.PageResult; import top.d7c.plugins.netty.websocket.local.LocalSessionImpl; import top.d7c.plugins.netty.websocket.local.LocalSessionManager; import top.d7c.plugins.netty.websocket.local.LocalSessionUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; @RestController @RequestMapping(value = "/test") public class TestController extends WebSocketController { @RequestMapping(value = "/test1") public Object test1(ChannelHandlerContext ctx, TextWebSocketFrame frame, PageData pd) { new Timer().schedule(new TimerTask() { @Override public void run() { send(); } }, 1000, // 任务创建 1 秒后开始执行第一次 10000); // 每隔 10 秒执行一次 return PageResult.ok("ok"); } public void send() { Collection allOnLines = LocalSessionUtil.getInstance().getAllOnLines(); System.out.println("allOnLines=======>" + allOnLines.toString()); for (LocalSessionManager localSessionManager : allOnLines) { Map sessionMap = localSessionManager.getSessionMap(); Set> entrySet = sessionMap.entrySet(); System.out.println("entrySet=======>" + entrySet.toString()); for (Entry entry : entrySet) { System.out.println("entrySet=======>" + entry.toString()); try { LocalSessionImpl session = entry.getValue(); Long attrId = session.getAttrId(); String attrSource = session.getAttrSource(); session.write(attrId + ":" + attrSource); System.out.println(attrId + ":" + attrSource); } catch (Exception e) { e.printStackTrace(); } } } } } ``` ## 使用说明 1. 安装 MySQL、Redis、zookeeper 等服务,数据库脚本位于项目根目录下的 d7c.sql; 2. 修改 d7c_dubbo_common/src/main/resources/config/*.properties、d7c_dubbo_services/d7c_dubbo_services_*/src/main/resources/config/*.properties、d7c_dubbo_client/d7c_dubbo_client_*/src/main/resources/config/d7c.properties 等配置文件中的连接参数; 3. 先启动 dubbo 服务生产者 top.d7c.dubbo.services.WebServicesStart.main(),再启动 dubbo 服务消费者 top.d7c.dubbo.client.*Start.main(),此处仅以启动 top.d7c.dubbo.client.WebStart.main() 服务作为显示,如需启动其他服务运行所属项目根包下的 main() 方法即可。 ## 运行展示 1. 启动 dubbo 服务生产者 top.d7c.dubbo.services.WebServicesStart.main() public static void main(String[] args) { com.alibaba.dubbo.container.Main.main(args); } ``` * * * [d7c][INFO ] [2021-06-10 15:32:26] com.alibaba.dubbo.registry.support.AbstractRegistry.notify(387) | [DUBBO] Notify urls for subscribe url provider://192.168.1.123:20880/top.d7c.dubbo.services.service.pay.SeckillService2?accepts=1000&anyhost=true&application=d7c_dubbo_services_web&application.version=0.0.0&bean.name=top.d7c.dubbo.services.service.pay.SeckillService2&category=configurators&check=false&default.loadbalance=roundrobin&default.retries=0&default.timeout=10000&dispatcher=all&dubbo=2.0.2&environment=test&generic=false&interface=top.d7c.dubbo.services.service.pay.SeckillService&methods=getSeckillGoods,seckill,getSeckillOrder,setSeckillResult,seckillOrderPay,setSeckillNumber&owner=wujialong&pid=14624&side=provider&threadpool=fixed&threads=100×tamp=1623310346196, urls: [empty://192.168.1.123:20880/top.d7c.dubbo.services.service.pay.SeckillService2?accepts=1000&anyhost=true&application=d7c_dubbo_services_web&application.version=0.0.0&bean.name=top.d7c.dubbo.services.service.pay.SeckillService2&category=configurators&check=false&default.loadbalance=roundrobin&default.retries=0&default.timeout=10000&dispatcher=all&dubbo=2.0.2&environment=test&generic=false&interface=top.d7c.dubbo.services.service.pay.SeckillService&methods=getSeckillGoods,seckill,getSeckillOrder,setSeckillResult,seckillOrderPay,setSeckillNumber&owner=wujialong&pid=14624&side=provider&threadpool=fixed&threads=100×tamp=1623310346196], dubbo version: 2.6.6, current host: 192.168.1.123 [d7c][WARN ] [2021-06-10 15:32:26] com.alibaba.dubbo.config.model.ApplicationModel.initProviderModel(73) | [DUBBO] already register the provider service: top.d7c.dubbo.services.service.pay.SeckillService, dubbo version: 2.6.6, current host: 192.168.1.123 [d7c][INFO ] [2021-06-10 15:32:26] com.alibaba.dubbo.container.Main.main(87) | [DUBBO] Dubbo SpringContainer started!, dubbo version: 2.6.6, current host: 192.168.1.123 [2021-06-10 15:32:26] Dubbo service server started! ``` 2. 启动 dubbo 服务消费者 top.d7c.dubbo.client.WebStart.main() public static void main(String[] args) { run(); } ``` * * * [d7c][INFO ] [2021-06-10 15:35:36] org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(364) | Mapped URL path [/plugins/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#1' [d7c][INFO ] [2021-06-10 15:35:36] org.springframework.web.servlet.FrameworkServlet.initServletBean(508) | FrameworkServlet 'springMvc': initialization completed in 3192 ms 六月 10, 2021 3:35:36 下午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["http-nio-9887"] ``` 3. 浏览器访问 127.0.0.1:9887/d7c.web 账号:wujialong 密码都是:000000 ![展示](https://images.gitee.com/uploads/images/2021/0610/154327_b6f86cbe_1070311.png "QQ图片20210610154131.png") ## 捐助打赏 如果您觉得我们的开源软件对你有所帮助,请扫下方二维码打赏我们一杯咖啡。 ![微信收款码](https://images.gitee.com/uploads/images/2021/0222/174352_b22739f5_1070311.jpeg "微信收款码.jpg") ![微信赞赏码](https://images.gitee.com/uploads/images/2021/0222/174521_67e18b39_1070311.jpeg "微信赞赏码.jpg") ![支付宝收款码](https://images.gitee.com/uploads/images/2021/0222/174540_94a9ac41_1070311.jpeg "支付宝收款码.jpg") ## 参与贡献 1. Fork 本仓库 2. 新建 d7c_dubbo_xxx 分支 3. 提交代码 4. 新建 Pull Request ## 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)