Explorar el Código

添加其他接口

lxg hace 4 años
padre
commit
8dacd93c3d
Se han modificado 7 ficheros con 77 adiciones y 194 borrados
  1. 1 1
      .gitignore
  2. 0 9
      .idea/micro.iml
  3. 0 8
      .idea/modules.xml
  4. 0 139
      .idea/workspace.xml
  5. 10 2
      micro.go
  6. 7 0
      options.go
  7. 59 35
      service.go

+ 1 - 1
.gitignore

@@ -8,7 +8,7 @@ dist
 _site
 _posts
 *.dat
-
+*.db
 
 
 # Go.gitignore

+ 0 - 9
.idea/micro.iml

@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="WEB_MODULE" version="4">
-  <component name="Go" enabled="true" />
-  <component name="NewModuleRootManager">
-    <content url="file://$MODULE_DIR$" />
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>

+ 0 - 8
.idea/modules.xml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/micro.iml" filepath="$PROJECT_DIR$/.idea/micro.iml" />
-    </modules>
-  </component>
-</project>

+ 0 - 139
.idea/workspace.xml

@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ChangeListManager">
-    <list default="true" id="cd58867b-089e-4508-9033-393b8939261c" name="Default Changelist" comment="">
-      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/options.go" beforeDir="false" afterPath="$PROJECT_DIR$/options.go" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/service.go" beforeDir="false" afterPath="$PROJECT_DIR$/service.go" afterDir="false" />
-    </list>
-    <option name="SHOW_DIALOG" value="false" />
-    <option name="HIGHLIGHT_CONFLICTS" value="true" />
-    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
-    <option name="LAST_RESOLUTION" value="IGNORE" />
-  </component>
-  <component name="FileTemplateManagerImpl">
-    <option name="RECENT_TEMPLATES">
-      <list>
-        <option value="Go File" />
-      </list>
-    </option>
-  </component>
-  <component name="GOROOT" url="file://C:/Go" />
-  <component name="Git.Settings">
-    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
-  </component>
-  <component name="GoLibraries">
-    <option name="indexEntireGoPath" value="false" />
-  </component>
-  <component name="ProjectId" id="1mwrWhYkIzDF8F0VWldeEUxzYT8" />
-  <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
-  <component name="ProjectViewState">
-    <option name="hideEmptyMiddlePackages" value="true" />
-    <option name="showLibraryContents" value="true" />
-  </component>
-  <component name="PropertiesComponent">
-    <property name="DefaultGoTemplateProperty" value="Go File" />
-    <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
-    <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
-    <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="configurable..is.expanded" value="false" />
-    <property name="configurable.GoLibrariesConfigurable.is.expanded" value="true" />
-    <property name="go.import.settings.migrated" value="true" />
-    <property name="go.sdk.automatically.set" value="true" />
-    <property name="go.tried.to.enable.integration.vgo.integrator" value="true" />
-    <property name="go.vendoring.notification.had.been.shown" value="true" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/gateway/http" />
-    <property name="settings.editor.selected.configurable" value="com.goide.configuration.GoLibrariesConfigurableProvider" />
-  </component>
-  <component name="RecentsManager">
-    <key name="CopyFile.RECENT_KEYS">
-      <recent name="D:\workspace\golang\micro\gateway\http" />
-      <recent name="D:\workspace\golang\micro\gateway\http\route" />
-      <recent name="D:\workspace\golang\micro" />
-      <recent name="D:\workspace\golang\micro\internal\micro\http\httprouter" />
-      <recent name="D:\workspace\golang\micro\internal\micro\http" />
-    </key>
-    <key name="MoveFile.RECENT_KEYS">
-      <recent name="D:\workspace\golang\micro\gateway\rpc" />
-      <recent name="D:\workspace\golang\micro" />
-      <recent name="D:\workspace\golang\micro\cmd" />
-      <recent name="D:\workspace\golang\micro\internal\micro\transport\rpc" />
-      <recent name="D:\workspace\golang\micro\internal\micro\transport\http" />
-    </key>
-  </component>
-  <component name="RunManager" selected="Go Build.go build git.nspix.com/golang/micro/cmd/mock/client">
-    <configuration name="go build git.nspix.com/golang/micro/cmd" type="GoApplicationRunConfiguration" factoryName="Go Application" temporary="true" nameIsGenerated="true">
-      <module name="micro" />
-      <working_directory value="$PROJECT_DIR$" />
-      <kind value="PACKAGE" />
-      <filePath value="$PROJECT_DIR$/cmd/main.go" />
-      <package value="git.nspix.com/golang/micro/cmd" />
-      <directory value="$PROJECT_DIR$" />
-      <method v="2" />
-    </configuration>
-    <configuration name="go build git.nspix.com/golang/micro/cmd/mock/client" type="GoApplicationRunConfiguration" factoryName="Go Application" temporary="true" nameIsGenerated="true">
-      <module name="micro" />
-      <working_directory value="$PROJECT_DIR$" />
-      <kind value="PACKAGE" />
-      <filePath value="$PROJECT_DIR$/cmd/mock/client/main.go" />
-      <package value="git.nspix.com/golang/micro/cmd/mock/client" />
-      <directory value="$PROJECT_DIR$" />
-      <method v="2" />
-    </configuration>
-    <configuration name="go build git.nspix.com/golang/micro/cmd/mock/rpc" type="GoApplicationRunConfiguration" factoryName="Go Application" temporary="true" nameIsGenerated="true">
-      <module name="micro" />
-      <working_directory value="$PROJECT_DIR$" />
-      <kind value="PACKAGE" />
-      <filePath value="$PROJECT_DIR$/cmd/mock/rpc/main.go" />
-      <package value="git.nspix.com/golang/micro/cmd/mock/rpc" />
-      <directory value="$PROJECT_DIR$" />
-      <method v="2" />
-    </configuration>
-    <configuration name="go build git.nspix.com/micro/cmd/mock/client" type="GoApplicationRunConfiguration" factoryName="Go Application" temporary="true" nameIsGenerated="true">
-      <module name="micro" />
-      <working_directory value="$PROJECT_DIR$" />
-      <kind value="PACKAGE" />
-      <filePath value="$PROJECT_DIR$/cmd/mock/client/main.go" />
-      <package value="git.nspix.com/micro/cmd/mock/client" />
-      <directory value="$PROJECT_DIR$" />
-      <method v="2" />
-    </configuration>
-    <configuration name="go build git.nspix.com/micro/cmd/mock/server" type="GoApplicationRunConfiguration" factoryName="Go Application" temporary="true" nameIsGenerated="true">
-      <module name="micro" />
-      <working_directory value="$PROJECT_DIR$" />
-      <kind value="PACKAGE" />
-      <filePath value="$PROJECT_DIR$/cmd/mock/server/main.go" />
-      <package value="git.nspix.com/micro/cmd/mock/server" />
-      <directory value="$PROJECT_DIR$" />
-      <method v="2" />
-    </configuration>
-    <recent_temporary>
-      <list>
-        <item itemvalue="Go Build.go build git.nspix.com/golang/micro/cmd" />
-        <item itemvalue="Go Build.go build git.nspix.com/golang/micro/cmd/mock/client" />
-        <item itemvalue="Go Build.go build git.nspix.com/golang/micro/cmd/mock/rpc" />
-        <item itemvalue="Go Build.go build git.nspix.com/micro/cmd/mock/client" />
-        <item itemvalue="Go Build.go build git.nspix.com/micro/cmd/mock/server" />
-      </list>
-    </recent_temporary>
-  </component>
-  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
-  <component name="TypeScriptGeneratedFilesManager">
-    <option name="version" value="3" />
-  </component>
-  <component name="Vcs.Log.Tabs.Properties">
-    <option name="TAB_STATES">
-      <map>
-        <entry key="MAIN">
-          <value>
-            <State />
-          </value>
-        </entry>
-      </map>
-    </option>
-    <option name="oldMeFiltersMigrated" value="true" />
-  </component>
-  <component name="VgoProject">
-    <integration-enabled>true</integration-enabled>
-  </component>
-</project>

+ 10 - 2
micro.go

@@ -2,10 +2,14 @@ package micro
 
 import (
 	"context"
+	"git.nspix.com/golang/micro/gateway/http"
+	"git.nspix.com/golang/micro/gateway/rpc"
+	"git.nspix.com/golang/micro/registry"
 )
 
 type (
 	applicationKey struct {
+
 	}
 
 	HandleOptions struct {
@@ -20,8 +24,12 @@ type (
 	HandleFunc func(ctx Context) (err error)
 
 	Application interface {
-		Handle(method string, cb HandleFunc, opts ...HandleOption)                     //注册一个处理器
-		CreateRequest(name, method string, body interface{}) (req *Request, err error) //创建一个rpc请求
+		Node() *registry.ServiceNode                                                //获取节点信息
+		HttpServe() *http.Server                                                    //获取HTTP实例
+		RPCServe() *rpc.Server                                                      //获取RPC实例
+		PeekService(name string) ([]*registry.ServiceNode, error)                   //选择一个服务
+		Handle(method string, cb HandleFunc, opts ...HandleOption)                  //注册一个处理器
+		NewRequest(name, method string, body interface{}) (req *Request, err error) //创建一个rpc请求
 	}
 
 	Server interface {

+ 7 - 0
options.go

@@ -13,6 +13,7 @@ type (
 		EnableHttp             bool              //启用HTTP功能
 		EnableRPC              bool              //启用RPC功能
 		EnableInternalListener bool              //启用内置网络监听服务
+		DisableRegister        bool              //禁用注册
 		registry               registry.Registry //注册仓库
 		Server                 Server            //加载的服务
 		Port                   int               //绑定端口
@@ -54,6 +55,12 @@ func WithoutHttp() Option {
 	}
 }
 
+func WithoutRegister() Option {
+	return func(o *Options) {
+		o.DisableRegister = true
+	}
+}
+
 func WithoutRPC() Option {
 	return func(o *Options) {
 		o.EnableRPC = false

+ 59 - 35
service.go

@@ -54,8 +54,10 @@ func (svr *Service) eventLoop() {
 	for {
 		select {
 		case <-ticker.C:
-			if err = svr.registry.Register(svr.node); err != nil {
-				log.Warnf("registry service %s error: %s", svr.opts.Name, err.Error())
+			if !svr.opts.DisableRegister {
+				if err = svr.registry.Register(svr.node); err != nil {
+					log.Warnf("registry service %s error: %s", svr.opts.Name, err.Error())
+				}
 			}
 		case <-svr.ctx.Done():
 			return
@@ -89,7 +91,7 @@ func (svr *Service) Handle(method string, cb HandleFunc, opts ...HandleOption) {
 	return
 }
 
-func (svr *Service) CreateRequest(name, method string, body interface{}) (req *Request, err error) {
+func (svr *Service) NewRequest(name, method string, body interface{}) (req *Request, err error) {
 	return &Request{
 		ServiceName: name,
 		Method:      method,
@@ -98,6 +100,10 @@ func (svr *Service) CreateRequest(name, method string, body interface{}) (req *R
 	}, nil
 }
 
+func (svr *Service) PeekService(name string) ([]*registry.ServiceNode, error) {
+	return svr.registry.Get(name)
+}
+
 func (svr *Service) HttpServe() *http.Server {
 	return svr.httpSvr
 }
@@ -106,6 +112,10 @@ func (svr *Service) RPCServe() *rpc.Server {
 	return svr.rpcSvr
 }
 
+func (svr *Service) Node() *registry.ServiceNode {
+	return svr.node
+}
+
 func (svr *Service) generateInstance() {
 	var (
 		err      error
@@ -152,6 +162,43 @@ func (svr *Service) generateInstance() {
 	}
 }
 
+func (svr *Service) startHttpServe() (err error) {
+	l := gateway.NewListener(svr.listener.Addr())
+	if err = svr.gateway.Attaches([][]byte{[]byte("GET"), []byte("POST"), []byte("PUT"), []byte("DELETE"), []byte("OPTIONS")}, l); err == nil {
+		svr.wrapSync(func() {
+			if err = svr.httpSvr.Serve(l); err != nil {
+				log.Warnf("http serve error: %s", err.Error())
+			}
+		})
+		svr.httpSvr.Handle("GET", "/healthy", func(ctx *http.Context) (err error) {
+			return ctx.Success(map[string]interface{}{
+				"id":      svr.node.ID,
+				"healthy": "healthy",
+				"uptime":  time.Now().Sub(svr.upTime).String(),
+			})
+		})
+		log.Infof("attach http server success")
+	} else {
+		log.Warnf("attach http listener error: %s", err.Error())
+	}
+	return
+}
+
+func (svr *Service) startRpcServe() (err error) {
+	l := gateway.NewListener(svr.listener.Addr())
+	if err = svr.gateway.Attach([]byte("RPC"), l); err == nil {
+		svr.wrapSync(func() {
+			if err = svr.rpcSvr.Serve(l); err != nil {
+				log.Warnf("rpc serve error: %s", err.Error())
+			}
+		})
+		log.Infof("attach rpc server success")
+	} else {
+		log.Warnf("attach rpc listener error: %s", err.Error())
+	}
+	return
+}
+
 func (svr *Service) prepare() (err error) {
 	log.Prefix(svr.opts.Name)
 	svr.ctx = WithContext(svr.ctx, svr)
@@ -181,47 +228,24 @@ func (svr *Service) prepare() (err error) {
 		svr.wrapSync(func() {
 			svr.gateway.Run(svr.ctx)
 		})
-		//启用HTTP服务
+
+		//start http serve
 		if svr.opts.EnableHttp {
-			l := gateway.NewListener(svr.listener.Addr())
-			if err = svr.gateway.Attaches([][]byte{[]byte("GET"), []byte("POST"), []byte("PUT"), []byte("DELETE"), []byte("OPTIONS")}, l); err == nil {
-				svr.wrapSync(func() {
-					if err = svr.httpSvr.Serve(l); err != nil {
-						log.Warnf("http serve error: %s", err.Error())
-					}
-				})
-				svr.httpSvr.Handle("GET", "/healthy", func(ctx *http.Context) (err error) {
-					return ctx.Success(map[string]interface{}{
-						"id":      svr.node.ID,
-						"healthy": "healthy",
-						"uptime":  time.Now().Sub(svr.upTime).String(),
-					})
-				})
-				log.Infof("attach http server success")
-			} else {
-				log.Warnf("attach http listener error: %s", err.Error())
-			}
+			err = svr.startHttpServe()
 		}
-		//启用RPC服务
+
+		//start rpc serve
 		if svr.opts.EnableRPC {
-			l := gateway.NewListener(svr.listener.Addr())
-			if err = svr.gateway.Attach([]byte("RPC"), l); err == nil {
-				svr.wrapSync(func() {
-					if err = svr.rpcSvr.Serve(l); err != nil {
-						log.Warnf("rpc serve error: %s", err.Error())
-					}
-				})
-				log.Infof("attach rpc server success")
-			} else {
-				log.Warnf("attach rpc listener error: %s", err.Error())
-			}
+			err = svr.startRpcServe()
 		}
 	}
 	svr.generateInstance()
 	svr.wrapSync(func() {
 		svr.eventLoop()
 	})
-	_ = svr.registry.Register(svr.node)
+	if !svr.opts.DisableRegister {
+		_ = svr.registry.Register(svr.node)
+	}
 	return
 }