前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天20分钟之基于grp+consul实现简单微服务

每天20分钟之基于grp+consul实现简单微服务

原创
作者头像
李子健
发布2022-09-21 23:24:53
2890
发布2022-09-21 23:24:53
举报
文章被收录于专栏:每日一善每日一善

基于grp+consul实现简单微服务

1 构建consul

consul 本机运行 /usr/local/bin/consul agent -dev -ui=true -client 0.0.0.0 &

http://127.0.0.1:8500/ui/dc1/services

定义proto

代码语言:txt
复制
syntax = "proto3";

option java_package = "cn.beckbi.pb";
option java_outer_classname = "AdInfo";



message Ad {
  int32 id = 1;
  string name = 2;
  string description = 3;
  float price = 4;
}

message AdId {
  int32 id = 1;
}

service AdRpc {
  rpc addAd(Ad) returns (AdId);
  rpc getAd(AdId) returns (Ad);
}

2 运行server

代码语言:txt
复制
    <dependencies>
        <dependency>
            <groupId>cn.beckbi</groupId>
            <artifactId>kgrpc-springboot-lib</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>net.devh</groupId>
            <artifactId>grpc-server-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

server代码

代码语言:txt
复制
package cn.beckbi.service;

import cn.beckbi.pb.AdInfo;
import cn.beckbi.pb.AdRpcGrpc;
import io.grpc.Status;
import io.grpc.StatusException;
import net.devh.boot.grpc.server.service.GrpcService;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.logging.Logger;

/**
 * @program: kgrpc
 * @description:
 * @author: bikang
 * @create: 2022-09-20 23:02
 */
@GrpcService
public class AdServiceImpl extends AdRpcGrpc.AdRpcImplBase  {

    private static final Logger logger = Logger.getLogger(AdServiceImpl.class.getName());

    private final Random random = new Random();

    private final Map<Integer, AdInfo.Ad> adInfoMap = new HashMap<>(50);

    @Override
    public void addAd(cn.beckbi.pb.AdInfo.Ad request,
                      io.grpc.stub.StreamObserver<cn.beckbi.pb.AdInfo.AdId> responseObserver) {
        int id = random.nextInt(100000000);



        logger.info("id:"+id);

        request = request.toBuilder().setId(id).build();
        adInfoMap.put(id, request);
        AdInfo.AdId adId = AdInfo.AdId.newBuilder().setId(id).build();
        responseObserver.onNext(adId);
        responseObserver.onCompleted();
    }

    @Override
    public void getAd(cn.beckbi.pb.AdInfo.AdId request,
                      io.grpc.stub.StreamObserver<cn.beckbi.pb.AdInfo.Ad> responseObserver) {
        int id = request.getId();

        logger.info("id:"+id);

        if (adInfoMap.containsKey(id)) {
            responseObserver.onNext((AdInfo.Ad) adInfoMap.get(id));
            responseObserver.onCompleted();
        }else {
            responseObserver.onError(new StatusException(Status.NOT_FOUND));
        }

    }
}

3 运行client

代码语言:txt
复制
   <dependencies>
        <dependency>
            <groupId>cn.beckbi</groupId>
            <artifactId>kgrpc-springboot-lib</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>net.devh</groupId>
            <artifactId>grpc-client-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

client代码

代码语言:txt
复制
@Slf4j
@Service
public class GrpcClientService {

    @GrpcClient("kgrpc-server-producer")
    private Channel serverChannel;

    public AdInfo.Ad  createAd(String name) {
        AdRpcGrpc.AdRpcBlockingStub stub = AdRpcGrpc.newBlockingStub(serverChannel);
        AdInfo.AdId adId = stub.addAd(AdInfo.Ad.newBuilder()
                .setName("cpl1")
                .setDescription(name)
                .setPrice(31.21f)
                .build());
        log.info("set ad "+ adId.getId()+" add success !");
        AdInfo.Ad ad = stub.getAd(adId);
        log.info("Ad: " + ad.toString());
        return ad;
    }
}

附录

代码路径: https://github.com/beckbikang/kgrpc/tree/main/kgrpc-springboot

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于grp+consul实现简单微服务
    • 1 构建consul
      • 2 运行server
        • 3 运行client
          • 附录
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档