This commit is contained in:
Newnius 2018-04-11 10:46:14 +08:00
parent 33e72857bf
commit 6c5797819e
11 changed files with 499 additions and 0 deletions

View File

@ -0,0 +1,74 @@
package main
import (
"fmt"
"log"
"time"
pb "newnius.com/ntp"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
const (
address = "ntp.newnius.com:8844"
)
var delay time.Duration
func getTime() time.Time {
return time.Now().Add(delay)
}
func tick () {
for {
t := getTime()
fmt.Printf("Current: %v/%v %02d:%02d:%02d\n", int(t.Month()), t.Day(), t.Hour(), t.Minute(), t.Second());
time.Sleep(1000 * time.Millisecond)
}
}
func sync() {
creds, err := credentials.NewClientTLSFromFile("server-cert.pem", "ntp.newnius.com")
if err != nil {
log.Fatalf("cert load error: %s", err)
}
//conn, err := grpc.Dial(address, grpc.WithInsecure())
conn, err := grpc.Dial(address, grpc.WithTransportCredentials(creds))
if err != nil {
log.Fatalf("unable to connect: %v", err)
}
defer conn.Close()
var c pb.NtpClient
for {
time.Sleep(5000 * time.Millisecond)
c = pb.NewNtpClient(conn)
start := time.Now().UnixNano()
//time.Sleep(5000 * time.Millisecond)
r, err := c.Query(context.Background(), &pb.NtpRequest{})
//time.Sleep(5000 * time.Millisecond)
if err != nil {
fmt.Printf("WARNING: unable to sync: %v\n", err)
continue
}
//fmt.Printf("Greeting: %v %s\n", i, r.Message)
//current = t.Add(time.Since(start) / 2)
//fmt.Println(r.Message)
m := ( time.Now().UnixNano() - start ) / 2 ;// / int64(time.Millisecond);
//fmt.Println(time.Duration(m))
delay = time.Duration(r.Message - start - m)
//fmt.Println(delay)
fmt.Printf("RPC call cost %v\n", time.Duration(m * 2))
//fmt.Printf("RPC call cost %v\n", time.Since(start))
//fmt.Printf("call cost %v\n", int64(time.Since(start) / time.Microsecond))
fmt.Println("DEBUG: synced")
}
}
func main() {
go sync()
tick()
}

View File

@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIFCjCCAvKgAwIBAgIJAIWzLYS8OHW6MA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV
BAMMD250cC5uZXduaXVzLmNvbTAeFw0xNzEwMjEwNzM2NTRaFw0xODEwMjEwNzM2
NTRaMBoxGDAWBgNVBAMMD250cC5uZXduaXVzLmNvbTCCAiIwDQYJKoZIhvcNAQEB
BQADggIPADCCAgoCggIBAL8Zedi6flVGEwHLq645WiTqLznRTImBRmEg+yLOsyyx
eLwAqJ+8lX9juIOX2QhDHltePegiHj9brFP2ClykHZEQjUdXHNsqEppUCz2Aozdg
RhCI08gYq8AQFOFZx8hXHiZVS31zhQU9+lLKhwz/cJK2vGWTwwTgqBp3vlIHOUEg
GMiatbBeEyK9w3TggYAhnONns0gBy/cQS0SJukIp6Ii/3h3AXXxoP1OUUn81mtkT
VNdBPqeH87T43jJJtQyOM+qetpTJvcAmpRksuca6i57HwwCnnTgo5TL7V8BXugHv
PLbyVLbNmaaX2AN5JqB9gz/67sSzsbVmgLl2nLoozAYuemWCO1rGBl/ked/+DPW5
IbBtl+a6r7hWxMmEZgbJWS0RxUlhyAWqWCpzkyTomlw+TCkctHTyJCpCsWPbdtFK
7E1fhEHdZn9NwmLuhAKgRcGGGSHYMhE8rsQOrwnTLS9N+YmdWe1n1Yav69/LDzkS
+oA7rXI9feQfv2WVQBbbiza8iKg4ioUSV50/0OJboyBUC4TfEwD+Hr9Z5kh1g/mi
W7i5821uvzm8aMtRnTir6NOqSkK2+BLBqoxC76FjsU2NOM4BvY6Ud2kV6JMIlXBv
2GbrA9skIz/kSFnnFZDizO6b7AGSEPkPxhPhr8fsX05Vfk8pzTBZx2RKv63kKUFF
AgMBAAGjUzBRMB0GA1UdDgQWBBRFl2xB7OAsxgAkVEFHzMhKLOTPAjAfBgNVHSME
GDAWgBRFl2xB7OAsxgAkVEFHzMhKLOTPAjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
SIb3DQEBCwUAA4ICAQBAFReyFUNFQUgb1ycfJFoPQ94VhtRunB3cl6Lg2Fukhfpn
Yf7gj3r3v7daJcUY1TOddi/xaOAb70Y7V/JRPNpMq6FgZR8t+s2IbkcZcZ5JdmoF
7MGXtj8G357SPLeEGsNDqfnWddvWDSXcH3OHONRL0ArVhFKff+KNIcimPgAQrDt0
GkKe2W74//8wMkEbMIt6r+dozBV+NKgWM7SSRW7FKlyzT5og1MuRG9gbebVFli+I
ABRHy3N4DJiyu8DtlQooLwC4aEBW0nUPzjYobIaoVvltAc88WMEDkvLyqc1H1Rbv
OFIzA0jmGBDBE3ESbndEdUz4m7ekWO4+6dSWL5InRhDSWGlDgq1V22yocP6hmRvT
stu4e79o4Y5+HVWEIqkpOCHKdye/CcevFt4Z9fYNMxHUEPYv655JE+ocIyEU53X8
9FmFxt0ACp0eyx0y9MFD5mkw7FWVi7Lp1OjljDQelDNf2C6rsTH66a3Cgk3dnUgg
9C+WrgYEKBkDODXZgtMaNBhgX/Py+l4CyODvhF6J/BFG/G+vRlU4Fan1g2C94RtQ
dU2xEoao0g2d61Q5WoZ4RfJ7LHD+QXqOKrcEuLTk+eSY5nj16kZc12yM59zBmpip
Cbr10Ix7ffoaADxUqpjiK+3q5pzWGQjapMVxU5ZUt0mFvI2p6UE0n18mW0q4tw==
-----END CERTIFICATE-----

View File

@ -0,0 +1,151 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: ntp.proto
/*
Package ntp is a generated protocol buffer package.
It is generated from these files:
ntp.proto
It has these top-level messages:
NtpRequest
NtpReply
*/
package ntp
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import (
context "golang.org/x/net/context"
grpc "google.golang.org/grpc"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type NtpRequest struct {
}
func (m *NtpRequest) Reset() { *m = NtpRequest{} }
func (m *NtpRequest) String() string { return proto.CompactTextString(m) }
func (*NtpRequest) ProtoMessage() {}
func (*NtpRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
type NtpReply struct {
// string message = 1;
Message int64 `protobuf:"varint,1,opt,name=message" json:"message,omitempty"`
}
func (m *NtpReply) Reset() { *m = NtpReply{} }
func (m *NtpReply) String() string { return proto.CompactTextString(m) }
func (*NtpReply) ProtoMessage() {}
func (*NtpReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
func (m *NtpReply) GetMessage() int64 {
if m != nil {
return m.Message
}
return 0
}
func init() {
proto.RegisterType((*NtpRequest)(nil), "ntp.NtpRequest")
proto.RegisterType((*NtpReply)(nil), "ntp.NtpReply")
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4
// Client API for Ntp service
type NtpClient interface {
Query(ctx context.Context, in *NtpRequest, opts ...grpc.CallOption) (*NtpReply, error)
}
type ntpClient struct {
cc *grpc.ClientConn
}
func NewNtpClient(cc *grpc.ClientConn) NtpClient {
return &ntpClient{cc}
}
func (c *ntpClient) Query(ctx context.Context, in *NtpRequest, opts ...grpc.CallOption) (*NtpReply, error) {
out := new(NtpReply)
err := grpc.Invoke(ctx, "/ntp.Ntp/Query", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for Ntp service
type NtpServer interface {
Query(context.Context, *NtpRequest) (*NtpReply, error)
}
func RegisterNtpServer(s *grpc.Server, srv NtpServer) {
s.RegisterService(&_Ntp_serviceDesc, srv)
}
func _Ntp_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(NtpRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(NtpServer).Query(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/ntp.Ntp/Query",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(NtpServer).Query(ctx, req.(*NtpRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Ntp_serviceDesc = grpc.ServiceDesc{
ServiceName: "ntp.Ntp",
HandlerType: (*NtpServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "Query",
Handler: _Ntp_Query_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "ntp.proto",
}
func init() { proto.RegisterFile("ntp.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 142 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xcc, 0x2b, 0x29, 0xd0,
0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0xce, 0x2b, 0x29, 0x50, 0xe2, 0xe1, 0xe2, 0xf2, 0x2b,
0x29, 0x08, 0x4a, 0x2d, 0x2c, 0x4d, 0x2d, 0x2e, 0x51, 0x52, 0xe1, 0xe2, 0x00, 0xf3, 0x0a, 0x72,
0x2a, 0x85, 0x24, 0xb8, 0xd8, 0x73, 0x53, 0x8b, 0x8b, 0x13, 0xd3, 0x53, 0x25, 0x18, 0x15, 0x18,
0x35, 0x98, 0x83, 0x60, 0x5c, 0x23, 0x03, 0x2e, 0x66, 0xbf, 0x92, 0x02, 0x21, 0x4d, 0x2e, 0xd6,
0xc0, 0xd2, 0xd4, 0xa2, 0x4a, 0x21, 0x7e, 0x3d, 0x90, 0xa1, 0x08, 0x63, 0xa4, 0x78, 0x11, 0x02,
0x05, 0x39, 0x95, 0x4a, 0x0c, 0x4e, 0x22, 0x5c, 0x42, 0xc9, 0xf9, 0xb9, 0x7a, 0xc9, 0xf9, 0x39,
0xf9, 0x49, 0xa5, 0x7a, 0x45, 0x05, 0xc9, 0x25, 0xa9, 0xc5, 0x25, 0x49, 0x6c, 0x60, 0x77, 0x18,
0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x39, 0x97, 0x07, 0x94, 0x00, 0x00, 0x00,
}

View File

@ -0,0 +1,18 @@
syntax = "proto3";
option java_package = "com.colobu.rpctest";
package ntp;
service Ntp {
rpc Query (NtpRequest) returns (NtpReply) {}
}
message NtpRequest {
//string timezone = 1;
}
message NtpReply {
//string message = 1;
int64 message = 1;
}

View File

@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIFCjCCAvKgAwIBAgIJAIWzLYS8OHW6MA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV
BAMMD250cC5uZXduaXVzLmNvbTAeFw0xNzEwMjEwNzM2NTRaFw0xODEwMjEwNzM2
NTRaMBoxGDAWBgNVBAMMD250cC5uZXduaXVzLmNvbTCCAiIwDQYJKoZIhvcNAQEB
BQADggIPADCCAgoCggIBAL8Zedi6flVGEwHLq645WiTqLznRTImBRmEg+yLOsyyx
eLwAqJ+8lX9juIOX2QhDHltePegiHj9brFP2ClykHZEQjUdXHNsqEppUCz2Aozdg
RhCI08gYq8AQFOFZx8hXHiZVS31zhQU9+lLKhwz/cJK2vGWTwwTgqBp3vlIHOUEg
GMiatbBeEyK9w3TggYAhnONns0gBy/cQS0SJukIp6Ii/3h3AXXxoP1OUUn81mtkT
VNdBPqeH87T43jJJtQyOM+qetpTJvcAmpRksuca6i57HwwCnnTgo5TL7V8BXugHv
PLbyVLbNmaaX2AN5JqB9gz/67sSzsbVmgLl2nLoozAYuemWCO1rGBl/ked/+DPW5
IbBtl+a6r7hWxMmEZgbJWS0RxUlhyAWqWCpzkyTomlw+TCkctHTyJCpCsWPbdtFK
7E1fhEHdZn9NwmLuhAKgRcGGGSHYMhE8rsQOrwnTLS9N+YmdWe1n1Yav69/LDzkS
+oA7rXI9feQfv2WVQBbbiza8iKg4ioUSV50/0OJboyBUC4TfEwD+Hr9Z5kh1g/mi
W7i5821uvzm8aMtRnTir6NOqSkK2+BLBqoxC76FjsU2NOM4BvY6Ud2kV6JMIlXBv
2GbrA9skIz/kSFnnFZDizO6b7AGSEPkPxhPhr8fsX05Vfk8pzTBZx2RKv63kKUFF
AgMBAAGjUzBRMB0GA1UdDgQWBBRFl2xB7OAsxgAkVEFHzMhKLOTPAjAfBgNVHSME
GDAWgBRFl2xB7OAsxgAkVEFHzMhKLOTPAjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
SIb3DQEBCwUAA4ICAQBAFReyFUNFQUgb1ycfJFoPQ94VhtRunB3cl6Lg2Fukhfpn
Yf7gj3r3v7daJcUY1TOddi/xaOAb70Y7V/JRPNpMq6FgZR8t+s2IbkcZcZ5JdmoF
7MGXtj8G357SPLeEGsNDqfnWddvWDSXcH3OHONRL0ArVhFKff+KNIcimPgAQrDt0
GkKe2W74//8wMkEbMIt6r+dozBV+NKgWM7SSRW7FKlyzT5og1MuRG9gbebVFli+I
ABRHy3N4DJiyu8DtlQooLwC4aEBW0nUPzjYobIaoVvltAc88WMEDkvLyqc1H1Rbv
OFIzA0jmGBDBE3ESbndEdUz4m7ekWO4+6dSWL5InRhDSWGlDgq1V22yocP6hmRvT
stu4e79o4Y5+HVWEIqkpOCHKdye/CcevFt4Z9fYNMxHUEPYv655JE+ocIyEU53X8
9FmFxt0ACp0eyx0y9MFD5mkw7FWVi7Lp1OjljDQelDNf2C6rsTH66a3Cgk3dnUgg
9C+WrgYEKBkDODXZgtMaNBhgX/Py+l4CyODvhF6J/BFG/G+vRlU4Fan1g2C94RtQ
dU2xEoao0g2d61Q5WoZ4RfJ7LHD+QXqOKrcEuLTk+eSY5nj16kZc12yM59zBmpip
Cbr10Ix7ffoaADxUqpjiK+3q5pzWGQjapMVxU5ZUt0mFvI2p6UE0n18mW0q4tw==
-----END CERTIFICATE-----

View File

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
kXi0ZhYY/qI+4S8d3TosuUee/Wvwwe21
-----END PRIVATE KEY-----

View File

@ -0,0 +1,54 @@
package main
import (
"log"
"net"
"time"
"golang.org/x/net/context"
"google.golang.org/grpc"
pb "newnius.com/ntp"
"google.golang.org/grpc/credentials"
)
var (
certFile = "server-cert.pem"
keyFile = "server-key.pem"
)
const (
port = ":8844"
)
type server struct{}
func (s *server) Query(ctx context.Context, in *pb.NtpRequest) (*pb.NtpReply, error) {
//loc, err := time.LoadLocation(in.Timezone)
//if err != nil {
// zone, _ := time.Now().Zone()
// loc, _ = time.LoadLocation(zone)
//}
//set timezone,
//now := time.Now().In(loc)
return &pb.NtpReply{Message: time.Now().UnixNano() + 100000000000}, nil
}
func main() {
creds, err := credentials.NewServerTLSFromFile(certFile, keyFile)
if err != nil {
log.Fatalf("Failed to setup tls: %v", err)
}
//log.Println(creds)
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer(
grpc.Creds(creds),
)
pb.RegisterNtpServer(s, &server{})
//reflection.Register(s)
//if err := s.Serve(lis); err != nil {
// log.Fatal("failed to serve: %v", err)
//}
s.Serve(lis)
}

BIN
src/rpc/client/client Executable file

Binary file not shown.

48
src/rpc/client/client.go Normal file
View File

@ -0,0 +1,48 @@
package main
import (
"errors"
"net/rpc"
"log"
"fmt"
)
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
func (t *Arith) Divide(args *Args, quo *Quotient) error {
if args.B == 0 {
return errors.New("divide by zero")
}
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
}
func main() {
serverAddress := "127.0.0.1"
client, err := rpc.DialHTTP("udp", serverAddress + ":1234")
if err != nil {
log.Fatal("Fatal error:", err)
}
//args := &server.Args{7, 8}
var args Args = Args{7, 8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d * %d = %d", args.A, args.B, reply)
}

BIN
src/rpc/server/server Executable file

Binary file not shown.

44
src/rpc/server/server.go Normal file
View File

@ -0,0 +1,44 @@
package main
import (
"errors"
"net/rpc"
"net"
"log"
"net/http"
)
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
func (t *Arith) Divide(args *Args, quo *Quotient) error {
if args.B == 0 {
return errors.New("divide by zero")
}
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
}
func main() {
arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("udp", ":1234")
if e != nil {
log.Fatal("Fatal error:", e)
}
http.Serve(l, nil)
}