<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## 概述 推薦使用 micro 最新版(v4) ## 安裝 micro 獲取 micro 命令 ``` go install go-micro.dev/v4/cmd/micro@master ``` > Version`1.16`or higher ## 初始化項目 1. 初始化項目 ``` micro new service helloworld cd helloworld make init make proto tidy ``` 如果想把proto 生成的代碼放到目錄下可先進行如下修改,在執行 `make proto` ``` option go_package = "./protoc;hello"; // 改為 option go_package = "./proto/hello;hello"; ``` 4. 運行 micro server ``` micro server ``` 5. 運行當前程序 ``` micro run . ``` 6. 查看狀態 ``` micro status ``` ## 添加組件 ### 添加配置中心 [service 層/Api 層] 1. 開啟 consul ``` docker run -d --name consul -p 8500:8500 consul ``` 2. 獲取consul的模塊 ``` go get github.com/asim/go-micro/plugins/config/source/consul/v4 ``` 3. 添加配置中心 ``` // common.go func GetConsulConfig(host string,port int64,prefix string)(config.Config,error) { source := consul.NewSource( consul.WithAddress(host+":"+strconv.FormatInt(port, 10)), consul.WithPrefix(prefix), consul.StripPrefix(true), ) newConfig, err := config.NewConfig() if err != nil { return nil,err } err = newConfig.Load(source) if err != nil { return nil,err } return newConfig,nil } // mysql.go func GetMysqlFromConsul(config config.Config,path ...string)*MysqlConfig{ mysqlConfig:=&MysqlConfig{} config.Get(path...).Scan(mysqlConfig) return mysqlConfig } // main.go consulConfig, err := common.GetConsulConfig("127.0.0.1", 8500, "/micro/config") if err != nil { log.Fatalln(err) } // 讀取配置的兩種方式 // 方式一:直接從consul獲取mysql 配置,從 consul 中獲取mysql的配置信息 mysqlInfo :=common.GetMysqlFromConsul(consulConfig,"mysql") // 方式二: 從 注冊的微服務中獲取,前提是必須注冊成 micro.Config(consulConfig), mysqlInfo :=common.GetMysqlFromConsul(srv.Options().Config,"mysql") ``` ### 添加注冊中心 [service 層/Api 層] 1. 獲取go mod ``` github.com/asim/go-micro/plugins/registry/consul/v4 ``` 2. 添加當前服務到注冊中心 ``` // 注冊 consul 成服務需要的consul 服務地址 consulRegistry:=consul.NewRegistry(func(opts *registry.Options) { opts.Addrs=[]string{ "127.0.0.1:8500", } }) // Create service srv := micro.NewService( micro.Name("category.service"), micro.Version("latest"), micro.Address("127.0.0.1:8082"), // 指定此服務的端口 micro.Registry(consulRegistry), // 把 micro 注冊到 consul ) ``` 3. 客戶端訪問 ``` // 配置注冊中心就可以訪問配置中心 consulRegistry:=consul.NewRegistry(func(opts *registry.Options) { opts.Addrs=[]string{ "127.0.0.1:8500", } }) service := micro.NewService( micro.Name("category.client"), micro.Version("latest"), micro.Registry(consulRegistry), ) service.Init() categoryService := category.NewCategoryService("category.service", service.Client()) ``` ### 添加鏈路追蹤 [service 層/Api 層] common/jaeger.go ```func NewTracer(serverName string,addr string)(opentracing.Tracer,io.Closer,error){ conf := &config.Configuration{ ServiceName: serverName, Sampler: &config.SamplerConfig{ Type: jaeger.SamplerTypeConst, Param: 1, }, Reporter: &config.ReporterConfig{ BufferFlushInterval: 1*time.Second, LogSpans: true, LocalAgentHostPort: addr, }, } tracer, closer, err := conf.NewTracer() return tracer,closer,err } ``` **服務層的main.go** ``` tracer, closer, err := common.NewTracer("go.micro.api.cartApi", "127.0.0.1:831") if err != nil { log.Error(err) } defer closer.Close() opentracing.SetGlobalTracer(tracer) // "github.com/opentracing/opentracing-go" srv := micro.NewService( micro.Name(service), micro.Version(version), micro.Address(addr), ... // 鏈路追蹤 // 因為是以客戶端的形式訪問, // WrapHandler -> WrapClient micro.WrapHandler( opentracing2.NewHandlerWrapper(opentracing.GlobalTracer()), ), ) ... ``` **API層的main.go** ``` tracer, closer, err := common.NewTracer("go.micro.api.cartApi", "127.0.0.1:831") if err != nil { log.Error(err) } defer closer.Close() opentracing.SetGlobalTracer(tracer) // "github.com/opentracing/opentracing-go" srv := micro.NewService( micro.Name(service), micro.Version(version), micro.Address(addr), ... // 鏈路追蹤 // 因為是以客戶端的形式訪問, // WrapHandler -> WrapClient micro.WrapClient( opentracing2.NewClientWrapper(opentracing.GlobalTracer()), ), ) ... ``` ### 添加限流 [service 層] **服務層的main.go** ``` srv := micro.NewService( micro.Name("cart.server"), micro.WrapHandler( // 添加限流 ratelimit.NewHandlerWrapper(QPS), ), ) srv.Init() ``` ### 添加負責均衡 [Api 層] main.go ``` srv := micro.NewService( micro.Name(service), // 添加負責均衡 micro.WrapClient(roundrobin.NewClientWrapper()), ) srv.Init() ``` ### 添加熔斷 [Api 層] main.go ``` //熔斷器 hystrixHandler := hystrix.NewStreamHandler() // github.com/afex/hystrix-go/hystrix hystrixHandler.Start() // 啟動端口 go func() { err := http.ListenAndServe(net.JoinHostPort("0.0.0.0", "9096"), hystrixHandler) if err != nil { log.Error(err) } }() srv := micro.NewService( micro.Name(service), ... // 添加熔斷 micro v4 可以直接添加 micro.WrapClient(hystrix2.NewClientWrapper()), ) srv.Init() ``` #### 添加 prometheus [參考](https://segmentfault.com/a/1190000023530052) 1. mciro 中添加 prometheus ``` import ( "net/http" "github.com/micro/go-plugins/wrapper/monitoring/prometheus/v2" "github.com/prometheus/client_golang/prometheus/promhttp" //... ) func main(){ // ... service := micro.NewService( micro.Name("go.micro.api.myauth"), micro.Version("latest"), micro.WrapHandler(prometheus.NewHandlerWrapper()), ) // ... } func PrometheusBoot() { http.Handle("/metrics", promhttp.Handler()) // 啟動web服務,監聽8085端口 go func() { err := http.ListenAndServe("localhost:8085", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } }( ``` 2. 啟動prometheus prometheus.yml ``` global: scrape_interval: 15s # By default, scrape targets every 15 seconds. # Attach these labels to any time series or alerts when communicating with # external systems (federation, remote storage, Alertmanager). external_labels: monitor: 'codelab-monitor' # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # Override the global default and scrape targets from this job every 5 seconds. scrape_interval: 5s static_configs: - targets: ['192.168.0.110:8085'] ``` 啟動 ``` docker run -d -p 9090:9090 -v prometheus.yml:/etc/prometheus/prometheus.yml --name p`rometheus prom/prometheus ``` 訪問 ``` http://localhost:9090/ ``` 3. 啟動grafana ``` docker run -d -p 3000:3000 grafana/grafana ``` 首先設置數據源,選擇prometheus,url填http://宿主ip:9090/ ,點擊保存,提示成功即可 ![](https://img.kancloud.cn/72/a7/72a756ff77c556463d18a0103520df57_732x418.png) ashboard中點擊`add panel`, 選擇數據源,填寫metrics(點擊有提示),完成后點`apply`即可
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看