PageSourceSearch

https://www.mcube.top/guide/framework/framework.html

html mcube.top collected 2026-10-05 01:08:40 UTC 136,861 bytes, 368 lines download raw bytes

1<!doctype html>
2<html lang="en">
3  <head>
4    <meta charset="UTF-8" />
5    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7    <meta name="generator" content="Rspress v1.45.1">
8    <title data-rh="true">框架概述 - mcube</title><meta data-rh="true" name="description" content="基于IOC为开发者提供配置即用的组件化开发体验的工具箱"/>
9  
9<script>{;const saved = localStorage.getItem('rspress-theme-appearance');const preferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;const isDark = !saved || saved === 'auto' ? preferDark : saved === 'dark';document.documentElement.classList.toggle('dark', isDark);document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';}</script>
9<link rel="icon" href="/mcube-light-logo.png">
9<script defer src="/static/js/styles.a20dd61f.js"></script>
9<script defer src="/static/js/lib-react.9dcbe93f.js"></script>
9<script defer src="/static/js/lib-router.3c71ab21.js"></script>
9<script defer src="/static/js/3036.7f077557.js"></script>
9<script defer src="/static/js/index.6aef61bf.js"></script>
9<link href="/static/css/styles.e45a8283.css" rel="stylesheet"></head>
10
11  <body >
12    <div id="root"><div class="navContainer_d18b1 rspress-nav px-6  sticky_ddfa7"><div class="container_e4235 flex justify-between items-center h-full"><div class="navBarTitle_c5f07"><a href="/index.html" class="link_a7cea flex items-center w-full h-full text-base font-semibold transition-opacity duration-300 hover:opacity-60"><div class="mr-1 min-w-8"><img src="/mcube-dark-logo.png" alt="logo" id="logo" class="rspress-logo dark:hidden"/><img src="/mcube-light-logo.png" alt="logo" id="logo" class="rspress-logo hidden dark:block"/></div><span>mcube</span></a></div><div class="flex flex-1 justify-end items-center"><div class="rightNav_a2fea"><div class="flex sm:flex-1 items-center sm:pl-4 sm:pr-2"><div class="rspress-nav-search-button navSearchButton_df1fb"><button><svg width="18" height="18" viewBox="0 0 32 32"><path fill="var(--rp-c-gray)" d="m29 27.586-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29ZM4 13a9 9 0 1 1 9 9 9.01 9.01 0 0 1-9-9"></path></svg><p class="searchWord_af2c1">Search Docs</p><div style="opacity:0"><span></span><span>K</span></div></button></div><div class="mobileNavSearchButton_d85a9"><svg width="24" height="24" viewBox="0 0 32 32"><path fill="var(--rp-c-gray)" d="m29 27.586-7.552-7.552a11.018 11.018 0 1 0-1.414 1.414L27.586 29ZM4 13a9 9 0 1 1 9 9 9.01 9.01 0 0 1-9-9"></path></svg></div></div><div class="rspress-nav-menu menu h-14"><a href="/guide/quickstart.html" class="link_a7cea "><div class="rspress-nav-menu-item singleItem_c1154 activeItem_a28b5 text-sm font-medium mx-1.5 px-3 py-2 flex items-center">框架指南</div></a><a href="/hello/index.html" class="link_a7cea "><div class="rspress-nav-menu-item singleItem_c1154  text-sm font-medium mx-1.5 px-3 py-2 flex items-center">应用模块</div></a></div><div class="flex-center flex-row"><div class="mx-2"><div class="md:mr-2 rspress-nav-appearance"><div class="p-1 border border-solid border-gray-300 text-gray-400  cursor-pointer rounded-md hover:border-gray-600 hover:text-gray-600 dark:hover:border-gray-200 dark:hover:text-gray-200 transition-all duration-300 w-7 h-7"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 24 24" class="dark:hidden" width="18" height="18" fill="currentColor"><path d="M12 18c-3.3 0-6-2.7-6-6s2.7-6 6-6 6 2.7 6 6-2.7 6-6 6m0-10c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4M12 4c-.6 0-1-.4-1-1V1c0-.6.4-1 1-1s1 .4 1 1v2c0 .6-.4 1-1 1M12 24c-.6 0-1-.4-1-1v-2c0-.6.4-1 1-1s1 .4 1 1v2c0 .6-.4 1-1 1M5.6 6.6c-.3 0-.5-.1-.7-.3L3.5 4.9c-.4-.4-.4-1 0-1.4s1-.4 1.4 0l1.4 1.4c.4.4.4 1 0 1.4-.1.2-.4.3-.7.3M19.8 20.8c-.3 0-.5-.1-.7-.3l-1.4-1.4c-.4-.4-.4-1 0-1.4s1-.4 1.4 0l1.4 1.4c.4.4.4 1 0 1.4-.2.2-.5.3-.7.3M3 13H1c-.6 0-1-.4-1-1s.4-1 1-1h2c.6 0 1 .4 1 1s-.4 1-1 1M23 13h-2c-.6 0-1-.4-1-1s.4-1 1-1h2c.6 0 1 .4 1 1s-.4 1-1 1M4.2 20.8c-.3 0-.5-.1-.7-.3-.4-.4-.4-1 0-1.4l1.4-1.4c.4-.4 1-.4 1.4 0s.4 1 0 1.4l-1.4 1.4c-.2.2-.4.3-.7.3M18.4 6.6c-.3 0-.5-.1-.7-.3-.4-.4-.4-1 0-1.4l1.4-1.4c.4-.4 1-.4 1.4 0s.4 1 0 1.4l-1.4 1.4c-.2.2-.5.3-.7.3"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 24 24" class="hidden dark:block" width="18" height="18" fill="currentColor"><path d="M12.1 22h-.9c-5.5-.5-9.5-5.4-9-10.9.4-4.8 4.2-8.6 9-9 .4 0 .8.2 1 .5s.2.8-.1 1.1c-2 2.7-1.4 6.4 1.3 8.4 2.1 1.6 5 1.6 7.1 0 .3-.2.7-.3 1.1-.1.3.2.5.6.5 1-.2 2.7-1.5 5.1-3.6 6.8-1.9 1.4-4.1 2.2-6.4 2.2M9.3 4.4c-2.9 1-5 3.6-5.2 6.8-.4 4.4 2.8 8.3 7.2 8.7 2.1.2 4.2-.4 5.8-1.8 1.1-.9 1.9-2.1 2.4-3.4-2.5.9-5.3.5-7.5-1.1-2.8-2.2-3.9-5.9-2.7-9.2"></path></svg></div></div></div><div class="social-links menu-item_e90a6 flex-center relative"><div class="flex-center h-full gap-x-4 transition-colors duration-300 md:mr-2"><a href="https://github.com/infraboard/mcube" target="_blank" rel="noopener noreferrer" class="social-links"><div class="social-links-icon_a4ad0"><div><svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 24 24"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></div></div></a></div></div></div></div><div class="mobileNavMenu_e7045"><div class="navScreen_ec30c  rspress-nav-screen" id="navScreen">
12<div class="container_c935d"><div class="navMenu_b887b"><div class="navMenuItem_e7978 w-full"><a href="/guide/quickstart.html" class="link_a7cea "><div class="rspress-nav-menu-item singleItem_c1154 activeItem_a28b5 text-sm font-medium mx-1.5 px-3 py-2 flex items-center">框架指南</div></a></div><div class="navMenuItem_e7978 w-full"><a href="/hello/index.html" class="link_a7cea "><div class="rspress-nav-menu-item singleItem_c1154  text-sm font-medium mx-1.5 px-3 py-2 flex items-center">应用模块</div></a></div></div><div class="flex-center flex-col gap-2"><div class="mt-2 navAppearance_bf893 flex justify-center"></div><div class="social-links menu-item_e90a6 flex-center relative"><div class="flex-center h-full gap-x-4 transition-colors duration-300 md:mr-2"><a href="https://github.com/infraboard/mcube" target="_blank" rel="noopener noreferrer" class="social-links"><div class="social-links-icon_a4ad0"><div><svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 24 24"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></div></div></a></div></div></div></div></div><button aria-label="mobile hamburger" class=" rspress-mobile-hamburger navHamburger_ac64c text-gray-500"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32" fill="currentColor"><circle cx="8" cy="16" r="2" fill="currentColor"></circle><circle cx="16" cy="16" r="2" fill="currentColor"></circle><circle cx="24" cy="16" r="2" fill="currentColor"></circle></svg></button></div></div></div></div><section><div class="docLayout_af141 pt-0"><aside class="sidebar_dd719 rspress-sidebar "><div class="navTitleMask_fb17c"><div class="navBarTitle_c5f07"><a href="/index.html" class="link_a7cea flex items-center w-full h-full text-base font-semibold transition-opacity duration-300 hover:opacity-60"><div class="mr-1 min-w-8"><img src="/mcube-dark-logo.png" alt="logo" id="logo" class="rspress-logo dark:hidden"/><img src="/mcube-light-logo.png" alt="logo" id="logo" class="rspress-logo hidden dark:block"/></div><span>mcube</span></a></div></div><div class="rspress-scrollbar sidebarContent_da296"><nav class="pb-2"><a href="/guide/arch.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:14px;margin-left:0;border-radius:0 var(--rp-radius) var(--rp-radius) 0;padding-left:24px;font-weight:bold"><span>架构理念</span></div></a><section class="rspress-sidebar-section mt-0.5 block" style="margin-left:0"><div class="rspress-sidebar-collapse flex justify-between items-center menuItem_ac22e" style="border-radius:0 var(--rp-radius) var(--rp-radius) 0;cursor:pointer"><h2 class="py-2 px-3 text-sm font-medium flex" style="font-size:14px;padding-left:24px;font-weight:bold"><span class="flex-center" style="font-size:14px">框架介绍</span></h2><div class="collapseContainer_d6e4e p-2 rounded-xl"><div style="cursor:pointer;transition:transform 0.2s ease-out;transform:rotate(90deg)"><svg width="1em" height="1em" viewBox="0 0 32 32"><path fill="currentColor" d="M22 16 12 26l-1.4-1.4 8.6-8.6-8.6-8.6L12 6z"></path></svg></div></div></div><div class="transition-all duration-300 ease-in-out" style="overflow:hidden"><div class="rspress-sidebar-group transition-opacity duration-500 ease-in-out" style="opacity:1;margin-left:12px"><div class="rspress-sidebar-item"><a href="/guide/framework/framework.html" class="link_a7cea menuLink_bb039"><div class="menuItemActive_de63c mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>框架概述</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/framework/ioc.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>框架原理</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/framework/quickstart.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>快速开始</span></div></a></div></div></div></section><section class="rspress-sidebar-section mt-0.5 block" style="margin-left:0"><div class="rspress-sidebar-collapse flex justify-between items-center menuItem_ac22e" style="border-radius:0 var(--rp-radius) var(--rp-radius) 0;cursor:pointer"><h2 class="py-2 px-3 text-sm font-medium flex" style="font-size:14px;padding-left:24px;font-weight:bold"><span class="flex-center" style="font-size:14px">应用配置</span></h2><div class="collapseContainer_d6e4e p-2 rounded-xl"><div style="cursor:pointer;transition:transform 0.2s ease-out;transform:rotate(90deg)"><svg width="1em" height="1em" viewBox="0 0 32 32">
12<path fill="currentColor" d="M22 16 12 26l-1.4-1.4 8.6-8.6-8.6-8.6L12 6z"></path></svg></div></div></div><div class="transition-all duration-300 ease-in-out" style="overflow:hidden"><div class="rspress-sidebar-group transition-opacity duration-500 ease-in-out" style="opacity:1;margin-left:12px"><div class="rspress-sidebar-item"><a href="/guide/config/server.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>Server</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/config/api_doc.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>API Doc</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/config/health_check.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>Health Check</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/config/log.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>Log</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/config/metric.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>Metric</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/config/trace.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>Trace</span></div></a></div></div></div></section><section class="rspress-sidebar-section mt-0.5 block" style="margin-left:0"><div class="rspress-sidebar-collapse flex justify-between items-center menuItem_ac22e" style="border-radius:0 var(--rp-radius) var(--rp-radius) 0;cursor:pointer"><h2 class="py-2 px-3 text-sm font-medium flex" style="font-size:14px;padding-left:24px;font-weight:bold"><span class="flex-center" style="font-size:14px">应用接口</span></h2><div class="collapseContainer_d6e4e p-2 rounded-xl"><div style="cursor:pointer;transition:transform 0.2s ease-out;transform:rotate(90deg)"><svg width="1em" height="1em" viewBox="0 0 32 32"><path fill="currentColor" d="M22 16 12 26l-1.4-1.4 8.6-8.6-8.6-8.6L12 6z"></path></svg></div></div></div><div class="transition-all duration-300 ease-in-out" style="overflow:hidden"><div class="rspress-sidebar-group transition-opacity duration-500 ease-in-out" style="opacity:1;margin-left:12px"><div class="rspress-sidebar-item"><a href="/guide/api/summary.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>概述</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/api/http.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>HTTP</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/api/grpc.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>GRPC</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/api/json_rpc.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>JsonRPC</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/api/exception.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>业务异常</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/api/response.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>接口响应</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/api/musk.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>接口脱敏</span></div></a></div></div></div></section><section class="rspress-sidebar-section mt-0.5 block" style="margin-left:0"><div class="rspress-sidebar-collapse flex justify-between items-center menuItem_ac22e" style="border-radius:0 var(--rp-radius) var(--rp-radius) 0;cursor:pointer"><h2 class="py-2 px-3 text-sm font-medium flex" style="font-size:14px;padding-left:24px;font-weight:bold"><span class="flex-center" style="font-size:14px">应用组件</span></h2><div class="collapseContainer_d6e4e p-2 rounded-xl"><div style="cursor:pointer;transition:transform 0.2s ease-out;transform:rotate(90deg)"><svg width="1em" height="1em" viewBox="0 0 32 32">
12<path fill="currentColor" d="M22 16 12 26l-1.4-1.4 8.6-8.6-8.6-8.6L12 6z"></path></svg></div></div></div><div class="transition-all duration-300 ease-in-out" style="overflow:hidden"><div class="rspress-sidebar-group transition-opacity duration-500 ease-in-out" style="opacity:1;margin-left:12px"><div class="rspress-sidebar-item"><a href="/guide/component/mysql.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>关系型数据库操作</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/mongo.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>MongoDB 数据库操作</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/redis.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>Redis 使用</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/vault.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>Vault 使用</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/kafka.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>Kafka 使用</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/nats.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>NATS 使用</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/rabbitmq.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>RabbitMQ 使用</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/bus.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>消息总线</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/cache.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>数据缓存</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/lock.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>分布式锁</span></div></a></div><div class="rspress-sidebar-item"><a href="/guide/component/ip2region.html" class="link_a7cea menuLink_bb039"><div class="menuItem_ac22e mt-0.5 py-2 px-3 font-medium flex" style="font-size:13px;margin-left:18px;border-radius:0 var(--rp-radius) var(--rp-radius) 0"><span>IP位置解析</span></div></a></div></div></div></section></nav></div></aside><div class="flex-1 relative min-w-0"><div class="rspress-sidebar-menu-container "><div class="rspress-sidebar-menu"><button type="button" class="flex-center mr-auto"><div class="text-md mr-2"><svg width="1em" height="1em" viewBox="0 0 32 32"><path fill="currentColor" d="M4 6h24v2H4zm0 18h24v2H4zm0-12h24v2H4zm0 6h24v2H4z"></path></svg></div><span class="text-sm">Menu</span></button><button type="button" class="flex-center ml-auto"><span class="text-sm">目录</span><div class="text-md mr-2" style="transform:rotate(0deg);transition:transform 0.2s ease-out;margin-top:2px"><svg width="1em" height="1em" viewBox="0 0 32 32">
12<path fill="currentColor" d="M22 16 12 26l-1.4-1.4 8.6-8.6-8.6-8.6L12 6z"></path></svg></div></button><div class="rspress-local-toc-container "><ul><li><a href="#核心概念" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:0"><span class="rspress-toc-link-text block">核心概念</span></a></li><li><a href="#应用开发" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:0"><span class="rspress-toc-link-text block">应用开发</span></a></li><li><a href="#选择开发框架" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:12px"><span class="rspress-toc-link-text block">选择开发框架</span></a></li><li><a href="#object接口" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:12px"><span class="rspress-toc-link-text block">Object接口</span></a></li><li><a href="#实现object接口-注册对象" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:12px"><span class="rspress-toc-link-text block">实现Object接口, 注册对象</span></a></li><li><a href="#对象初始化" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:12px"><span class="rspress-toc-link-text block">对象初始化</span></a></li><li><a href="#启动服务器" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:12px"><span class="rspress-toc-link-text block">启动服务器</span></a></li><li><a href="#完整代码" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:12px"><span class="rspress-toc-link-text block">完整代码</span></a></li><li><a href="#工程化" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:0"><span class="rspress-toc-link-text block">工程化</span></a></li><li><a href="#标准化工程配置" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:12px"><span class="rspress-toc-link-text block">标准化工程配置</span></a></li><li><a href="#即插即用的组件" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:12px"><span class="rspress-toc-link-text block">即插即用的组件</span></a></li><li><a href="#功能强大的模块" class="link_a7cea rspress-toc-link sm:text-normal text-sm" style="margin-left:12px"><span class="rspress-toc-link-text block">功能强大的模块</span></a></li></ul></div></div></div><div class="content_ff766 rspress-doc-container flex"><div class="flex-1 overflow-x-auto"><div class="rspress-doc"><!--$--><h1 id="框架概述" class="rspress-doc-title text-3xl mb-10 leading-10 tracking-tight title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#框架概述">#</a>框架概述</h1>
13<p class="my-4 leading-7">mcube是一款用于构建渐进式微服务(单体--&gt;微服务)的框架, 让应用从单体无缝过渡到微服务, 同时提供丰富的配置即用的功能配置,
14只需简单配置就可拥有:</p>
15<ul class="list-disc pl-5 my-4 leading-7">
16<li class="[&amp;:not(:first-child)]:mt-2">Log: 支持文件滚动和Trace的日志打印</li>
17<li class="[&amp;:not(:first-child)]:mt-2">Metric: 支持应用自定义指标监控</li>
18<li class="[&amp;:not(:first-child)]:mt-2">Trace: 集成支持完整的全链路追踪(HTTP Server/GRPC Server/数据库...)以及自定义埋点</li>
19<li class="[&amp;:not(:first-child)]:mt-2">CORS: 资源跨域共享</li>
20<li class="[&amp;:not(:first-child)]:mt-2">Health Check: HTTP 和 GRPC 健康检查</li>
21<li class="[&amp;:not(:first-child)]:mt-2">API DOC: 基于Swagger的 API 文档</li>
22</ul>
23<p class="my-4 leading-7">除了上面这些功能配置,还会用到很多三方工具, 也是配置即用:</p>
24<ul class="list-disc pl-5 my-4 leading-7">
25<li class="[&amp;:not(:first-child)]:mt-2">MySQL: Grom集成</li>
26<li class="[&amp;:not(:first-child)]:mt-2">MongoDB 官方驱动集成</li>
27<li class="[&amp;:not(:first-child)]:mt-2">Redis: go-redis集成</li>
28<li class="[&amp;:not(:first-child)]:mt-2">Kafka: kafka-go集成</li>
29<li class="[&amp;:not(:first-child)]:mt-2">分布式缓存: 当前只适配了Redis</li>
30<li class="[&amp;:not(:first-child)]:mt-2">分布式锁: 当前只适配了Redis</li>
31</ul>
32<div class="rspress-directive info"><div class="rspress-directive-title">提示</div><div class="rspress-directive-content"><p class="my-4 leading-7">
33mcube的核心理念是提供一套优良的软件架构, 应对软件从简单到复杂的过程。所以关注点在架构设计, 而不是发明工具, 因此尽量选择集成社区优秀的工具。<br/>
34</p></div></div>
35<h2 id="核心概念" class="mt-12 mb-6 pt-8 text-2xl tracking-tight border-t-[1px] border-divider-light title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#核心概念">#</a>核心概念</h2>
36<p class="my-4 leading-7">框架采用面向对象的设计思想, 将整个程序的对象分为4类:</p>
37<ul class="list-disc pl-5 my-4 leading-7">
38<li class="[&amp;:not(:first-child)]:mt-2">API: 接口对象, 负责对外提供接口, 现支持框架: Gin/GoRestful</li>
39<li class="[&amp;:not(:first-child)]:mt-2">Controller: 负责编写具体的业务逻辑, 如果业务非常简单, 且没有复用场景 可以考虑直接写在API对象内部</li>
40<li class="[&amp;:not(:first-child)]:mt-2">Config: 配置对象, 业务逻辑中共用的工具, 比如 数据库, kafka, redis之类</li>
41<li class="[&amp;:not(:first-child)]:mt-2">Default: 通用对象, 除了上面3中对象之外的其他对象, 预留区域,暂时未使用</li>
42</ul>
43<p class="my-4 leading-7">这4类对象分别存储在4个区域(Namespace), 这4个区域共同组成的这个容器就叫Ioc分区容器:</p>
44<p class="my-4 leading-7"><img src="/img/mcube/ioc_namespace.png" alt=""/></p>
45<p class="my-4 leading-7">其中 API和Controller区域的对象 需要应用开发者开发, 而Config区域的对象 由框架和社区开发</p>
46<h2 id="应用开发" class="mt-12 mb-6 pt-8 text-2xl tracking-tight border-t-[1px] border-divider-light title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#应用开发">#</a>应用开发</h2>
47<p class="my-4 leading-7">下面演示一个简单应用的开发, 开发一个API 接口获取DB Stats, 要获取DB Stats, 只需要获取到DB的连接池对象, 调用Stats方法即可:</p>
48<div class="language-go">
48<div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span>db</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Stats</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
49<p class="my-4 leading-7">返回结果:</p>
50<div class="language-json"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-json" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
51</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-parameter)">&quot;data&quot;</span><span class="token operator">:</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
52</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-parameter)">&quot;MaxOpenConnections&quot;</span><span class="token operator">:</span><span> </span><span class="token number">0</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
53</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-parameter)">&quot;OpenConnections&quot;</span><span class="token operator">:</span><span> </span><span class="token number">1</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
54</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-parameter)">&quot;InUse&quot;</span><span class="token operator">:</span><span> </span><span class="token number">0</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
55</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-parameter)">&quot;Idle&quot;</span><span class="token operator">:</span><span> </span><span class="token number">1</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
56</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-parameter)">&quot;WaitCount&quot;</span><span class="token operator">:</span><span> </span><span class="token number">0</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
57</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-parameter)">&quot;WaitDuration&quot;</span><span class="token operator">:</span><span> </span><span class="token number">0</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
58</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-parameter)">&quot;MaxIdleClosed&quot;</span><span class="token operator">:</span><span> </span><span class="token number">0</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
59</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-parameter)">&quot;MaxIdleTimeClosed&quot;</span><span class="token operator">:</span><span> </span><span class="token number">0</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
60</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-parameter)">&quot;MaxLifetimeClosed&quot;</span><span class="token operator">:</span><span> </span><span class="token number">0</span><span>
61</span></span><span style="display:block;padding:0 1.25rem"><span>    </span><span class="token" style="color:var(--code-token-punctuation)">}</span><span>
62</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d">
62<path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
63<h3 id="选择开发框架" class="mt-10 mb-2 leading-7 text-xl title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#选择开发框架">#</a>选择开发框架</h3>
64<p class="my-4 leading-7">Api对象支持2种框架:</p>
65<ul class="list-disc pl-5 my-4 leading-7">
66<li class="[&amp;:not(:first-child)]:mt-2">Gin</li>
67<li class="[&amp;:not(:first-child)]:mt-2">GoRestful(v3)</li>
68</ul>
69<h3 id="object接口" class="mt-10 mb-2 leading-7 text-xl title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#object接口">#</a>Object接口</h3>
70<p class="my-4 leading-7">无论使用那个框架,都需要实现Object接口, 只有实现了该接口,该对象才能被ioc空间管理:</p>
71<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-comment)">// Object接口, 需要注册到ioc空间托管的对象需要实现的方法</span><span>
72</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">type</span><span> Object </span><span class="token" style="color:var(--code-token-keyword)">interface</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
73</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 对象初始化, 初始化对象的属性</span><span>
74</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-function)">Init</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">error</span><span>
75</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 对象的名称, 根据名称可以从空间中取出对象</span><span>
76</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-function)">Name</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">string</span><span>
77</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 对象版本, 默认v1</span><span>
78</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-function)">Version</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">string</span><span>
79</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 对象优先级, 根据优先级 控制对象初始化的顺序</span><span>
80</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-function)">Priority</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">int</span><span>
81</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 对象的销毁, 服务关闭时调用</span><span>
82</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-function)">Close</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>ctx context</span><span class="token" style="color:var(--code-token-punctuation)">
82.</span><span>Context</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">error</span><span>
83</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 是否允许同名对象被替换, 默认不允许被替换</span><span>
84</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-function)">AllowOverwrite</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">bool</span><span>
85</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 对象一些元数据, 对象的更多描述信息, 扩展使用</span><span>
86</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-function)">Meta</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> ObjectMeta
87</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
88<p class="my-4 leading-7">可用通过继承ObjectImpl对象 获取Object接口的默认实现, 然后按需进行覆写, 下面是我们设计的ApiHandler对象:</p>
89<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-keyword)">import</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>
90</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc&quot;</span><span>
91</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
92</span></span><span style="display:block;padding:0 1.25rem">
93</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">type</span><span> ApiHandler </span><span class="token" style="color:var(--code-token-keyword)">struct</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
94</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 继承自Ioc对象</span><span>
95</span></span><span style="display:block;padding:0 1.25rem"><span>  ioc</span><span class="token" style="color:var(--code-token-punctuation)">
95.</span><span>ObjectImpl
96</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
97<h3 id="实现object接口-注册对象" class="mt-10 mb-2 leading-7 text-xl title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#实现object接口-注册对象">#</a>实现Object接口, 注册对象</h3>
98<p class="my-4 leading-7">通过继承已经实现了Object接口</p>
99<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-keyword)">type</span><span> ApiHandler </span><span class="token" style="color:var(--code-token-keyword)">struct</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
100</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 继承自Ioc对象</span><span>
101</span></span><span style="display:block;padding:0 1.25rem"><span>	ioc</span><span class="token" style="color:var(--code-token-punctuation)">
101.</span><span>ObjectImpl
102</span></span><span style="display:block;padding:0 1.25rem">
103</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// db属性, gorm DB对象</span><span>
104</span></span><span style="display:block;padding:0 1.25rem"><span>	db </span><span class="token operator">*</span><span>gorm</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>DB
105</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
106<p class="my-4 leading-7">覆写对象的名称, 默认为对象反射名称,比如: *main.ApiHandler</p>
107<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-comment)">// 覆写对象的名称, 该名称名称会体现在API的路径前缀里面</span><span>
108</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// 比如: /simple/api/v1/module_a/db_stats</span><span>
109</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// 其中/simple/api/v1/module_a 就是对象API前缀, 命名规则如下:</span><span>
110</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// &lt;service_name&gt;/&lt;path_prefix&gt;/&lt;object_version&gt;/&lt;object_name&gt;</span><span>
111</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>h </span><span class="token operator">*</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-function)">Name</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">string</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
112</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-keyword)">return</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;module_a&quot;</span><span>
113</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d">
113<path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
114<p class="my-4 leading-7">这样ApiHandler就实现了GinApiObject接口, 此时就可以把它注册到api区域了:</p>
115<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-keyword)">import</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>
116</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc&quot;</span><span>
117</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
118</span></span><span style="display:block;padding:0 1.25rem">
119</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-function)">main</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
120</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 注册HTTP接口类</span><span>
121</span></span><span style="display:block;padding:0 1.25rem"><span>  ioc</span><span class="token" style="color:var(--code-token-punctuation)">
121.</span><span class="token" style="color:var(--code-token-function)">Api</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Registry</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token operator">&amp;</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">{</span><span class="token" style="color:var(--code-token-punctuation)">}</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
122</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token operator">...</span><span>
123</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
124<h3 id="对象初始化" class="mt-10 mb-2 leading-7 text-xl title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#对象初始化">#</a>对象初始化</h3>
125<p class="my-4 leading-7">现在ApiHandler的db属性还没初始化, 可以直接通过引入Datasource组件, 获取Gorm的db对象</p>
126<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-keyword)">type</span><span> ApiHandler </span><span class="token" style="color:var(--code-token-keyword)">struct</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
127</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 继承自Ioc对象</span><span>
128</span></span><span style="display:block;padding:0 1.25rem"><span>	ioc</span><span class="token" style="color:var(--code-token-punctuation)">
128.</span><span>ObjectImpl
129</span></span><span style="display:block;padding:0 1.25rem">
130</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// db属性, gorm DB对象</span><span>
131</span></span><span style="display:block;padding:0 1.25rem"><span>	db </span><span class="token operator">*</span><span>gorm</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>DB
132</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
133<p class="my-4 leading-7">要完成对象属性的初始化需要覆写Init()方法, mcube框架在启动时,会自动调用该方法来初始化对象</p>
134<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-comment)">// 初始化db属性, 从ioc的配置区域获取共用工具 gorm db对象</span><span>
135</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>h </span><span class="token operator">*</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-function)">Init</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">error</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
136</span></span><span style="display:block;padding:0 1.25rem"><span>	h</span><span class="token" style="color:var(--code-token-punctuation)">
136.</span><span>db </span><span class="token operator">=</span><span> datasource</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">DB</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
137</span></span><span style="display:block;padding:0 1.25rem">
138</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 进行业务暴露, router 通过ioc</span><span>
139</span></span><span style="display:block;padding:0 1.25rem"><span>	router </span><span class="token operator">:=</span><span> ioc_gin</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">RootRouter</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
140</span></span><span style="display:block;padding:0 1.25rem"><span>	router</span><span class="token" style="color:var(--code-token-punctuation)">
140.</span><span class="token" style="color:var(--code-token-function)">GET</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-string)">&quot;/db_stats&quot;</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> h</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>GetDbStats</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
141</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-keyword)">return</span><span> </span><span class="token boolean">nil</span><span>
142</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span><span>
143</span></span><span style="display:block;padding:0 1.25rem">
144</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// 业务功能</span><span>
145</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>h </span><span class="token operator">*</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-function)">GetDbStats</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>ctx </span><span class="token operator">*</span><span>gin</span><span class="token" style="color:var(--code-token-punctuation)">
145.</span><span>Context</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
146</span></span><span style="display:block;padding:0 1.25rem"><span>	db</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> </span><span class="token boolean">_</span><span> </span><span class="token operator">:=</span><span> h</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>db</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">DB</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
147</span></span><span style="display:block;padding:0 1.25rem"><span>	ctx</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">JSON</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>http</span><span class="token" style="color:var(--code-token-punctuation)">
147.</span><span>StatusOK</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> gin</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>H</span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
148</span></span><span style="display:block;padding:0 1.25rem"><span>		</span><span class="token" style="color:var(--code-token-string)">&quot;data&quot;</span><span class="token" style="color:var(--code-token-punctuation)">:</span><span> db</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Stats</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
149</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-punctuation)">}</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
150</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
151<p class="my-4 leading-7">然后通过配置文件进行组件配置: etc/application.toml (后面启动时会制定配置文件读取路径)</p>
152<div class="language-toml"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-toml" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-punctuation)">[</span><span class="token class-name" style="display:content">datasource</span><span class="token" style="color:var(--code-token-punctuation)">]</span><span>
153</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">host</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;127.0.0.1&quot;</span><span>
154</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">port</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token number">3306</span><span>
155</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">username</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;root&quot;</span><span>
156</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">password</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;123456&quot;</span><span>
157</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">database</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;test&quot;</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d">
157<path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
158<h3 id="启动服务器" class="mt-10 mb-2 leading-7 text-xl title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#启动服务器">#</a>启动服务器</h3>
159<p class="my-4 leading-7">通过server.Run()启动服务:</p>
160<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-keyword)">import</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>
161</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc/server&quot;</span><span>
162</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
163</span></span><span style="display:block;padding:0 1.25rem">
164</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-function)">main</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
165</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 注册HTTP接口类</span><span>
166</span></span><span style="display:block;padding:0 1.25rem"><span>	ioc</span><span class="token" style="color:var(--code-token-punctuation)">
166.</span><span class="token" style="color:var(--code-token-function)">Api</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Registry</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token operator">&amp;</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">{</span><span class="token" style="color:var(--code-token-punctuation)">}</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
167</span></span><span style="display:block;padding:0 1.25rem">
168</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 开启配置文件读取配置</span><span>
169</span></span><span style="display:block;padding:0 1.25rem"><span>	server</span><span class="token" style="color:var(--code-token-punctuation)">
169.</span><span>DefaultConfig</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>ConfigFile</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>Enabled </span><span class="token operator">=</span><span> </span><span class="token boolean">true</span><span>
170</span></span><span style="display:block;padding:0 1.25rem"><span>	server</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>DefaultConfig</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>ConfigFile</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>Path </span><span class="token operator">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;etc/application.toml&quot;</span><span>
171</span></span><span style="display:block;padding:0 1.25rem">
172</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 启动应用</span><span>
173</span></span><span style="display:block;padding:0 1.25rem"><span>	err </span><span class="token operator">:=</span><span> server</span><span class="token" style="color:var(--code-token-punctuation)">
173.</span><span class="token" style="color:var(--code-token-function)">Run</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>context</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Background</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
174</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-keyword)">if</span><span> err </span><span class="token operator">!=</span><span> </span><span class="token boolean">nil</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
175</span></span><span style="display:block;padding:0 1.25rem"><span>		</span><span class="token" style="color:var(--code-token-function)">panic</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>err</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
176</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-punctuation)">}</span><span>
177</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
178<p class="my-4 leading-7">最后启动服务 可以看到api已经可以访问:</p>
179<div class="language-sh"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-sh" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span>$ mcube/examples/simple ‹master*› » go run main.go
180</span></span><span style="display:block;padding:0 1.25rem">2024-01-04T21:48:48+08:00 INFO   ioc/server/server.go:74 &gt; loaded configs: [app.v1 trace.v1 log.v1 datasource.v1 grpc.v1 http.v1] component:SERVER
181</span><span style="display:block;padding:0 1.25rem">2024-01-04T21:48:48+08:00 INFO   ioc/server/server.go:75 &gt; loaded controllers: [] component:SERVER
182</span><span style="display:block;padding:0 1.25rem">2024-01-04T21:48:48+08:00 INFO   ioc/server/server.go:76 &gt; loaded apis: [module_a.v1] component:SERVER
183</span><span style="display:block;padding:0 1.25rem">[GIN-debug] GET    /simple/api/v1/module_a/db_stats --&gt; main.(*ApiHandler).Registry.func1 (3 handlers)
184</span><span style="display:block;padding:0 1.25rem">2024-01-04T21:48:48+08:00 INFO   config/http/http.go:211 &gt; HTTP服务启动成功, 监听地址: 127.0.0.1:8020 component:HTTP</span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d">
184<path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
185<h3 id="完整代码" class="mt-10 mb-2 leading-7 text-xl title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#完整代码">#</a>完整代码</h3>
186<p class="my-4 leading-7">完整<a href="https://github.com/infraboard/mcube/blob/master/examples/simple/main.go" rel="noopener noreferrer" target="_blank" class="link_a7cea  link_a9ef4 inline-link_f855c">样例代码</a></p>
187<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-keyword)">package</span><span> main
188</span></span><span style="display:block;padding:0 1.25rem">
189</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">import</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>
190</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-string)">&quot;context&quot;</span><span>
191</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-string)">&quot;net/http&quot;</span><span>
192</span></span><span style="display:block;padding:0 1.25rem">
193</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-string)">&quot;github.com/gin-gonic/gin&quot;</span><span>
194</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc&quot;</span><span>
195</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc/config/datasource&quot;</span><span>
196</span></span><span style="display:block;padding:0 1.25rem"><span>	ioc_gin </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc/config/gin&quot;</span><span>
197</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc/server&quot;</span><span>
198</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-string)">&quot;gorm.io/gorm&quot;</span><span>
199</span></span><span style="display:block;padding:0 1.25rem">
200</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 开启Health健康检查</span><span>
201</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token boolean">_</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc/apps/health/gin&quot;</span><span>
202</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 开启Metric</span><span>
203</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token boolean">_</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc/apps/metric/gin&quot;</span><span>
204</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
205</span></span><span style="display:block;padding:0 1.25rem">
206</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-function)">main</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
207</span></span><span style="display:block;padding:0 1.25rem"><span>
207	</span><span class="token" style="color:var(--code-token-comment)">// 注册HTTP接口类</span><span>
208</span></span><span style="display:block;padding:0 1.25rem"><span>	ioc</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Api</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Registry</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token operator">&amp;</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">{</span><span class="token" style="color:var(--code-token-punctuation)">}</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
209</span></span><span style="display:block;padding:0 1.25rem">
210</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 开启配置文件读取配置</span><span>
211</span></span><span style="display:block;padding:0 1.25rem"><span>	server</span><span class="token" style="color:var(--code-token-punctuation)">
211.</span><span>DefaultConfig</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>ConfigFile</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>Enabled </span><span class="token operator">=</span><span> </span><span class="token boolean">true</span><span>
212</span></span><span style="display:block;padding:0 1.25rem"><span>	server</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>DefaultConfig</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>ConfigFile</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>Path </span><span class="token operator">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;etc/application.toml&quot;</span><span>
213</span></span><span style="display:block;padding:0 1.25rem">
214</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 启动应用</span><span>
215</span></span><span style="display:block;padding:0 1.25rem"><span>	err </span><span class="token operator">:=</span><span> server</span><span class="token" style="color:var(--code-token-punctuation)">
215.</span><span class="token" style="color:var(--code-token-function)">Run</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>context</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Background</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
216</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-keyword)">if</span><span> err </span><span class="token operator">!=</span><span> </span><span class="token boolean">nil</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
217</span></span><span style="display:block;padding:0 1.25rem"><span>		</span><span class="token" style="color:var(--code-token-function)">panic</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>err</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
218</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-punctuation)">}</span><span>
219</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span><span>
220</span></span><span style="display:block;padding:0 1.25rem">
221</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">type</span><span> ApiHandler </span><span class="token" style="color:var(--code-token-keyword)">struct</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
222</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 继承自Ioc对象</span><span>
223</span></span><span style="display:block;padding:0 1.25rem"><span>	ioc</span><span class="token" style="color:var(--code-token-punctuation)">
223.</span><span>ObjectImpl
224</span></span><span style="display:block;padding:0 1.25rem">
225</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// mysql db依赖</span><span>
226</span></span><span style="display:block;padding:0 1.25rem"><span>	db </span><span class="token operator">*</span><span>gorm</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>DB
227</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span><span>
228</span></span><span style="display:block;padding:0 1.25rem">
229</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// 覆写对象的名称, 该名称名称会体现在API的路径前缀里面</span><span>
230</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// 比如: /simple/api/v1/module_a/db_stats</span><span>
231</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// 其中/simple/api/v1/module_a 就是对象API前缀, 命名规则如下:</span><span>
232</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// &lt;service_name&gt;/&lt;path_prefix&gt;/&lt;object_version&gt;/&lt;object_name&gt;</span><span>
233</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>h </span><span class="token operator">*</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-function)">Name</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">string</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
234</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-keyword)">return</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;module_a&quot;</span><span>
235</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span><span>
236</span></span><span style="display:block;padding:0 1.25rem">
237</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// 初始化db属性, 从ioc的配置区域获取共用工具 gorm db对象</span><span>
238</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>h </span><span class="token operator">*</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-function)">Init</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-symbol)">error</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
239</span></span><span style="display:block;padding:0 1.25rem"><span>	h</span><span class="token" style="color:var(--code-token-punctuation)">
239.</span><span>db </span><span class="token operator">=</span><span> datasource</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">DB</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
240</span></span><span style="display:block;padding:0 1.25rem">
241</span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 进行业务暴露, router 通过ioc</span><span>
242</span></span><span style="display:block;padding:0 1.25rem"><span>	router </span><span class="token operator">:=</span><span> ioc_gin</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">RootRouter</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
243</span></span><span style="display:block;padding:0 1.25rem"><span>	router</span><span class="token" style="color:var(--code-token-punctuation)">
243.</span><span class="token" style="color:var(--code-token-function)">GET</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-string)">&quot;/db_stats&quot;</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> h</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>GetDbStats</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
244</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-keyword)">return</span><span> </span><span class="token boolean">nil</span><span>
245</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span><span>
246</span></span><span style="display:block;padding:0 1.25rem">
247</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-comment)">// 业务功能</span><span>
248</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>h </span><span class="token operator">*</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-function)">GetDbStats</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>ctx </span><span class="token operator">*</span><span>gin</span><span class="token" style="color:var(--code-token-punctuation)">
248.</span><span>Context</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
249</span></span><span style="display:block;padding:0 1.25rem"><span>	db</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> </span><span class="token boolean">_</span><span> </span><span class="token operator">:=</span><span> h</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>db</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">DB</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
250</span></span><span style="display:block;padding:0 1.25rem"><span>	ctx</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">JSON</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>http</span><span class="token" style="color:var(--code-token-punctuation)">
250.</span><span>StatusOK</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> gin</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>H</span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
251</span></span><span style="display:block;padding:0 1.25rem"><span>		</span><span class="token" style="color:var(--code-token-string)">&quot;data&quot;</span><span class="token" style="color:var(--code-token-punctuation)">:</span><span> db</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Stats</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
252</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-punctuation)">}</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
253</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
254<h2 id="工程化" class="mt-12 mb-6 pt-8 text-2xl tracking-tight border-t-[1px] border-divider-light title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#工程化">#</a>工程化</h2>
255<p class="my-4 leading-7">有同学看到这里可能会十分不解, 上面这样简单的功能, 我几行代码就能搞定, 为啥要搞那么复杂:</p>
256<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-function)">main</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
257</span></span><span style="display:block;padding:0 1.25rem"><span>  r </span><span class="token operator">:=</span><span> gin</span><span class="token" style="color:var(--code-token-punctuation)">
257.</span><span class="token" style="color:var(--code-token-function)">Default</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>  
258</span></span><span style="display:block;padding:0 1.25rem"><span>  dsn </span><span class="token operator">:=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&amp;parseTime=True&amp;loc=Local&quot;</span><span>
259</span></span><span style="display:block;padding:0 1.25rem"><span>  db</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> err </span><span class="token operator">:=</span><span> gorm</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Open</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>mysql</span><span class="token" style="color:var(--code-token-punctuation)">
259.</span><span class="token" style="color:var(--code-token-function)">Open</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>dsn</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> </span><span class="token operator">&amp;</span><span>gorm</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>Config</span><span class="token" style="color:var(--code-token-punctuation)">{</span><span class="token" style="color:var(--code-token-punctuation)">}</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
260</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-keyword)">if</span><span> err </span><span class="token operator">!=</span><span> </span><span class="token boolean">nil</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
261</span></span><span style="display:block;padding:0 1.25rem"><span>  	</span><span class="token" style="color:var(--code-token-function)">panic</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>err</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
262</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-punctuation)">}</span><span>
263</span></span><span style="display:block;padding:0 1.25rem"><span>  r</span><span class="token" style="color:var(--code-token-punctuation)">
263.</span><span class="token" style="color:var(--code-token-function)">GET</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-string)">&quot;/simple/api/v1/module_a/db_stats&quot;</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> </span><span class="token" style="color:var(--code-token-keyword)">func</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>ctx </span><span class="token operator">*</span><span>gin</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>Context</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
264</span></span><span style="display:block;padding:0 1.25rem"><span>  	db</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> </span><span class="token boolean">_</span><span> </span><span class="token operator">:=</span><span> db</span><span class="token" style="color:var(--code-token-punctuation)">
264.</span><span class="token" style="color:var(--code-token-function)">DB</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
265</span></span><span style="display:block;padding:0 1.25rem"><span>  	ctx</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">JSON</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>http</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>StatusOK</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> gin</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>H</span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
266</span></span><span style="display:block;padding:0 1.25rem"><span>  		</span><span class="token" style="color:var(--code-token-string)">&quot;data&quot;</span><span class="token" style="color:var(--code-token-punctuation)">:</span><span> db</span><span class="token" style="color:var(--code-token-punctuation)">
266.</span><span class="token" style="color:var(--code-token-function)">Stats</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span>
267</span></span><span style="display:block;padding:0 1.25rem"><span>  	</span><span class="token" style="color:var(--code-token-punctuation)">}</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
268</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-punctuation)">}</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
269</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
270<p class="my-4 leading-7">针对简单的功能, 上面这样写固然没问题, 甚至更易读, 但是随着业务发展, 功能越来越多, 业务越来越复杂, 如果这样写, 到了后期基本无法维护。</p>
271<p class="my-4 leading-7">想要业务从简单到复杂, 代码维护的复杂度不增加, 我们就需要对工程进行统一的设计, 提供统一的标准, 我们通过下面3个纬度体验mcube 工程化带来的好处:</p>
272<ul class="list-disc pl-5 my-4 leading-7">
273<li class="[&amp;:not(:first-child)]:mt-2">标准化工程配置</li>
274<li class="[&amp;:not(:first-child)]:mt-2">即插即用的组件</li>
275<li class="[&amp;:not(:first-child)]:mt-2">灵活的模块组合</li>
276</ul>
277<h3 id="标准化工程配置" class="mt-10 mb-2 leading-7 text-xl title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#标准化工程配置">#</a>标准化工程配置</h3>
278<p class="my-4 leading-7">统一了项目的配置加载方式:</p>
279<ul class="list-disc pl-5 my-4 leading-7">
280<li class="[&amp;:not(:first-child)]:mt-2">环境变量</li>
281<li class="[&amp;:not(:first-child)]:mt-2">配置文件<!-- -->
282<ul class="list-disc pl-5 my-4 leading-7">
283<li class="[&amp;:not(:first-child)]:mt-2">TOML</li>
284<li class="[&amp;:not(:first-child)]:mt-2">YAML</li>
285<li class="[&amp;:not(:first-child)]:mt-2">JSON</li>
286</ul>
287</li>
288</ul>
289<p class="my-4 leading-7">下面是项目配置文件(etc/application.toml)内容:</p>
290<div class="language-toml"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-toml" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-punctuation)">[</span><span class="token class-name" style="display:content">app</span><span class="token" style="color:var(--code-token-punctuation)">]</span><span>
291</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">name</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;simple&quot;</span><span>
292</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">key</span><span>  </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;this is your app key&quot;</span><span>
293</span></span><span style="display:block;padding:0 1.25rem">
294</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">[</span><span class="token class-name" style="display:content">http</span><span class="token" style="color:var(--code-token-punctuation)">]</span><span>
295</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">host</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;127.0.0.1&quot;</span><span>
296</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">port</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token number">8020</span><span>
297</span></span><span style="display:block;padding:0 1.25rem">
298</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">[</span><span class="token class-name" style="display:content">datasource</span><span class="token" style="color:var(--code-token-punctuation)">]</span><span>
299</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">host</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;127.0.0.1&quot;</span><span>
300</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">port</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token number">3306</span><span>
301</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">username</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;root&quot;</span><span>
302</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">password</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;123456&quot;</span><span>
303</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">database</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;test&quot;</span><span>
304</span></span><span style="display:block;padding:0 1.25rem">
305</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">[</span><span class="token class-name" style="display:content">log</span><span class="token" style="color:var(--code-token-punctuation)">]</span><span>
306</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">level</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;debug&quot;</span><span>
307</span></span><span style="display:block;padding:0 1.25rem">
308</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">[</span><span class="token class-name" style="display:content">log.file</span><span class="token" style="color:var(--code-token-punctuation)">]</span><span>
309</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">enable</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token boolean">true</span><span>
310</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-parameter)">file_path</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;logs/app.log&quot;</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d">
310<path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
311<p class="my-4 leading-7">更多配置见左侧应用配置板块</p>
312<h3 id="即插即用的组件" class="mt-10 mb-2 leading-7 text-xl title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#即插即用的组件">#</a>即插即用的组件</h3>
313<p class="my-4 leading-7">通过简单的配置就能为项目添加:</p>
314<ul class="list-disc pl-5 my-4 leading-7">
315<li class="[&amp;:not(:first-child)]:mt-2">检查检查(Health Chcek)</li>
316<li class="[&amp;:not(:first-child)]:mt-2">应用指标监控(Metric)</li>
317</ul>
318<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-keyword)">import</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>
319</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 开启Health健康检查</span><span>
320</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token boolean">_</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc/apps/health/gin&quot;</span><span>
321</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-comment)">// 开启Metric</span><span>
322</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token boolean">_</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/mcube/v2/ioc/apps/metric/gin&quot;</span><span>
323</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">)</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
324<p class="my-4 leading-7">启动过后, 在日志里就能看到这2个功能开启了:</p>
325<div class="language-sh"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-sh" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span>2024-01-05T11:30:00+08:00 INFO   health/gin/check.go:52 &gt; Get the Health using http://127.0.0.1:8020/healthz component:HEALTH_CHECK
326</span></span><span style="display:block;padding:0 1.25rem">2024-01-05T11:30:00+08:00 INFO   metric/gin/metric.go:51 &gt; Get the Metric using http://127.0.0.1:8020/metrics component:METRIC</span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d">
326<path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
327<p class="my-4 leading-7">当然你也可以通过配置来修改功能的URL路径:</p>
328<div class="language-toml"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-toml" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-punctuation)">[</span><span class="token class-name" style="display:content">health</span><span class="token" style="color:var(--code-token-punctuation)">]</span><span>
329</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-parameter)">path</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;/healthz&quot;</span><span>
330</span></span><span style="display:block;padding:0 1.25rem">
331</span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">[</span><span class="token class-name" style="display:content">metric</span><span class="token" style="color:var(--code-token-punctuation)">]</span><span>
332</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-parameter)">enable</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token boolean">true</span><span>
333</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-parameter)">provider</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;prometheus&quot;</span><span>
334</span></span><span style="display:block;padding:0 1.25rem"><span>  </span><span class="token" style="color:var(--code-token-parameter)">endpoint</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">=</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;/metrics&quot;</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
335<h3 id="功能强大的模块" class="mt-10 mb-2 leading-7 text-xl title_fb7eb"><a class="link_a7cea header-anchor link_a9ef4 inline-link_f855c" aria-hidden="true" href="#功能强大的模块">#</a>功能强大的模块</h3>
336<p class="my-4 leading-7">在服务开发的过程中,我们将一些通用功能打包成一个模块, 在é
336¡¹ç›®ä¸­å¼•å…¥, 这样可以减少重复代码, 提高开发效率。</p>
337<p class="my-4 leading-7">下面是一个IAM(身份与权限管理)模块:</p>
338<ul class="list-disc pl-5 my-4 leading-7">
339<li class="[&amp;:not(:first-child)]:mt-2">管理管理接口</li>
340<li class="[&amp;:not(:first-child)]:mt-2">令牌管理接口</li>
341<li class="[&amp;:not(:first-child)]:mt-2">权限中间件</li>
342<li class="[&amp;:not(:first-child)]:mt-2">初始化的CLI</li>
343</ul>
344<p class="my-4 leading-7"><img src="/img/mcube/iam.png" alt="iam"/></p>
345<p class="my-4 leading-7">在程序启动时引入模块:</p>
346<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-keyword)">import</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>
347</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 引入IAM模块组件</span><span>
348</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token boolean">_</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/modules/iam&quot;</span><span>
349</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token" style="color:var(--code-token-comment)">// 引入IAM模块CLI工具</span><span>
350</span></span><span style="display:block;padding:0 1.25rem"><span>	</span><span class="token boolean">_</span><span> </span><span class="token" style="color:var(--code-token-string)">&quot;github.com/infraboard/modules/iam/cmd&quot;</span><span>
351</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">)</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
352<p class="my-4 leading-7">然后初始化:</p>
353<div class="language-sh"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-sh" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span># 初始化管理员用户
354</span></span><span style="display:block;padding:0 1.25rem">$ modules/iam/example ‹main*› » go run main.go init                                                                               1 ↵
355</span><span style="display:block;padding:0 1.25rem">? 请输入管理员用户名称: admin
356</span><span style="display:block;padding:0 1.25rem">? 请输入管理员密码: ******
357</span><span style="display:block;padding:0 1.25rem">? 再次输入管理员密码: ******</span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d">
357<path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
358<p class="my-4 leading-7">在业务接口开发中,使用中间件 就引入的身份认证和RBAC鉴权</p>
359<div class="language-go"><div class="rspress-code-content rspress-scrollbar"><div><pre class="code" style="background-color:inherit"><code class="language-go" style="white-space:pre"><span style="display:block;padding:0 1.25rem"><span class="token" style="color:var(--code-token-comment)">// API路由</span><span>
360</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-keyword)">func</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>h </span><span class="token operator">*</span><span>ApiHandler</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-function)">Registry</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>r gin</span><span class="token" style="color:var(--code-token-punctuation)">
360.</span><span>IRouter</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span> </span><span class="token" style="color:var(--code-token-punctuation)">{</span><span>
361</span></span><span style="display:block;padding:0 1.25rem"><span>	r</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Use</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>middleware</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">Auth</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
362</span></span><span style="display:block;padding:0 1.25rem"><span>	r</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span class="token" style="color:var(--code-token-function)">GET</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span class="token" style="color:var(--code-token-string)">&quot;/db_stats&quot;</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> middleware</span><span class="token" style="color:var(--code-token-punctuation)">
362.</span><span class="token" style="color:var(--code-token-function)">Perm</span><span class="token" style="color:var(--code-token-punctuation)">(</span><span>user</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>ROLE_ADMIN</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span class="token" style="color:var(--code-token-punctuation)">,</span><span> h</span><span class="token" style="color:var(--code-token-punctuation)">.</span><span>DBStats</span><span class="token" style="color:var(--code-token-punctuation)">)</span><span>
363</span></span><span style="display:block;padding:0 1.25rem"><span></span><span class="token" style="color:var(--code-token-punctuation)">}</span></span></code></pre></div><div class="code-button-group_fb445"><button title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrapped_fb89b"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="icon-wrap_ccd3d"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="code-copy-button_c5089" title="Copy code"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="icon-copy_ef942"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="icon-success_d5ec0"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
364<p class="my-4 leading-7">模块的具体使用文档可以参考: <a href="https://github.com/infraboard/modules/tree/main/iam" rel="noopener noreferrer" target="_blank" class="link_a7cea  link_a9ef4 inline-link_f855c">IAM模块</a></p><!--/$--></div><div class="rspress-doc-footer"><footer class="mt-8"><div class="xs:flex pb-5 px-2 justify-end items-center"></div><div class="flex flex-col"></div><div class="flex flex-col sm:flex-row sm:justify-around gap-4 pt-6"><div class="prev_c92d1 flex flex-col"><a href="/guide/arch.html" class="link_a7cea pager-link_e0d2d"><span class="desc_dcc01">上一页</span><span class="title_a3acb">架构理念</span></a></div><div class="next_c11be flex flex-col"><a href="/guide/framework/ioc.html" class="link_a7cea pager-link_e0d2d next_ad355"><span class="desc_dcc01">下一页</span><span class="title_a3acb">框架原理</span></a></div></div></footer></div></div><div class="aside-container_bc5fa"><div class="flex flex-col"><div id="aside-container" class="relative text-sm font-medium"><div class="leading-7 block text-sm font-semibold pl-3">目录</div><nav class="mt-1"><ul class="relative"><li><a href="#核心概念" title="核心概念" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:0;font-weight:semibold"><span class="aside-link-text block">核心概念</span></a></li><li><a href="#应用开发" title="应用开发" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:0;font-weight:semibold"><span class="aside-link-text block">应用开发</span></a></li><li><a href="#选择开发框架" title="选择开发框架" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:12px;font-weight:semibold"><span class="aside-link-text block">选择开发框架</span></a></li><li><a href="#object接口" title="Object接口" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:12px;font-weight:semibold"><span class="aside-link-text block">Object接口</span></a></li><li><a href="#实现object接口-注册对象" title="实现Object接口, 注册对象" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:12px;font-weight:semibold"><span class="aside-link-text block">实现Object接口, 注册对象</span></a></li><li><a href="#对象初始化" title="对象初始化" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:12px;font-weight:semibold"><span class="aside-link-text block">对象初始化</span></a></li><li><a href="#启动服务器" title="启动服务器" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:12px;font-weight:semibold"><span class="aside-link-text block">启动服务器</span></a></li><li><a href="#完整代码" title="完整代码" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:12px;font-weight:semibold"><span class="aside-link-text block">完整代码</span></a></li><li><a href="#工程化" title="工程化" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:0;font-weight:semibold"><span class="aside-link-text block">工程化</span></a></li><li><a href="#标准化工程配置" title="标准化工程配置" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:12px;font-weight:semibold"><span class="aside-link-text block">标准化工程配置</span></a></li><li><a href="#即插即用的组件" title="即插即用的组件" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:12px;font-weight:semibold"><span class="aside-link-text block">即插即用的组件</span></a></li><li><a href="#功能强大的模块" title="功能强大的模块" class="aside-link transition-all duration-300 hover:text-text-1 text-text-2 block" style="margin-left:12px;font-weight:semibold"><span class="aside-link-text block">功能强大的模块</span></a></li></ul></nav></div></div></div></div></div></div></section></div>
365    <div id="search-container"></div>
366  
366<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"6c6d6f62f1cf42fb9c1d9486cacf87f1","r":1,"spa":2}' crossorigin="anonymous"></script>
366
367</body>
368</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.