IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 简单分布式系统开发day02 -> 正文阅读

[大数据]简单分布式系统开发day02

源码已经上传,有需要可在资源下载。在分布式day01的基础上,本节的新增内容主要是注册服务并独立运行,
在这里插入图片描述
首先在distributed文件夹下创建registry文件夹并在其下分别创建client.go,registration.go和server.go文件。
1、client.go

package registry

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

func RegisterService(r Registration)error  {
	buf := new(bytes.Buffer)
	enc := json.NewEncoder(buf)
	err :=enc.Encode(r)
	if err!=nil{
		return err
	}
	res,err := http.Post(ServiceURL,"application/json",buf)
    if err !=nil{
		return err
	}
	if res.StatusCode!=http.StatusOK{
		return fmt.Errorf("Failed to register")
	}
	return nil
}

主要用于客户端的注册服务,其中创建Post请求向注册地址即ServiceURL请求注册服务
2、registration.go

package registry
type  Registration struct {
	ServiceName ServiceName
	ServiceURL string
}
type ServiceName string
const(
	LogService = ServiceName("LogService")
)

创建注册信息结构体包括服务名服务地址
3、server.go

package registry

import (
	"encoding/json"
	"log"
	"net/http"
	"sync"
)

const  ServerPort =":3000"
const ServiceURL = "http://localhost"+ServerPort+"/services"
type registry struct {
	registrations []Registration//已经注册的服务
	mutex *sync.Mutex//因为集合动态变化且可能并发访问为保证线程安全则加互斥锁
}

func (r *registry)add(reg Registration)error  {
      r.mutex.Lock()
	  r.registrations = append(r.registrations,reg)
	  r.mutex.Unlock()
	  return  nil
}

//注册的服务集群
var reg = registry{
	registrations: make([]Registration,0),
	mutex: new(sync.Mutex),
}

type  RegistryService struct {}//让其成为一个Handle

func (s RegistryService)ServeHTTP(w http.ResponseWriter,r *http.Request)  {
   log.Println("Request received")
	switch r.Method {
	case http.MethodPost:
		dec := json.NewDecoder(r.Body)
		var r Registration
		err := dec.Decode(&r)
		if err!=nil{
			log.Println(err)
			w.WriteHeader(http.StatusBadRequest)
			return
		}
		log.Printf("Add service:%v with URL %v\n",r.ServiceName,r.ServiceURL)
		err = reg.add(r)
		if err!=nil{
			log.Println(err)
			w.WriteHeader(http.StatusBadRequest)
			return
		}
	default:
		w.WriteHeader(http.StatusMethodNotAllowed)
	}
}

用于将请求注册的服务加入注册服务集群中,此时的RegistryService因为实现了ServeHTTP接口,故成为了一个Handle,当请求为 //访问该地址后,启动RegistryService使其成为一个handle,如下,当请求为/services时,RegistryService便会将服务信息添加到注册集群中

http.Handle("/services",&registry.RegistryService{})

在cmd包下创建如下目录
在这里插入图片描述
main.go的内容如下

package main
import (
	"context"
	"distributed/registry"
	"fmt"
	"log"
	"net/http"
)
//注册服务
func main() {
	//访问该地址后,启动RegistryService使其称为一个handle
	http.Handle("/services",&registry.RegistryService{})
	//创建上下文和取消上下文
	ctx,cancle :=context.WithCancel(context.Background())
	//创建http.Server变量
	var srv http.Server
	//服务端口
	srv.Addr = registry.ServerPort
	go func() {
		//启动服务是否成功,日志记录
		log.Println(srv.ListenAndServe())
		//结束线程
		cancle()
	}()
	go func(){
		fmt.Println("Registry service started.Press any key to stop.")
		var s string
		fmt.Scanln(&s)
		srv.Shutdown(ctx)
		cancle()
	}()

	<-ctx.Done()
	fmt.Println("shutting down registy service")
}

其中ctx的作用,个人认为是退出服务的条件,即让<-ctx.Done不再阻塞,即可退出。
参数做如下修改
在这里插入图片描述
在这里插入图片描述
其中先执行注册服务,再执行日志服务
在这里插入图片描述
测试工具Postman
在这里插入图片描述
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 11:59:11  更:2022-01-28 12:00:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:57:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码