springCloud微服务开发环境问题

swing wang 2020-04-14 02:30:25
springCloud微服务现在非常火热
我们公司也在跟风使用这种技术
不过现在遇到一个比较蛋疼的问题
恳请有经验的大神们分享一下解决方案

众所周知 微服务要有一个注册中心以及N个各种各样的服务
那么我们在开发时如果全部在本地搞一个开发环境的话
以我们公司目前的微服务拆分情况就得启动十多个服务
电脑的硬件扛不住啊 16G内存都经常不够用

但是如果在公司内网搞一个注册中心,每个团队负责的服务都往上面注册的话
那势必会造成,我注册了A服务,其他同事也注册了A服务
在断点调试的时候,我的请求跑他电脑上去,他的请求跑我电脑上来
而且我们的代码还正在修改,肯定完全不一样
最终会出现各种各样的问题


烦请各位大神分享下你们的解决方案,谢谢!
...全文
228 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
swing wang 2020-04-14
  • 打赏
  • 举报
回复
引用 12 楼 maradona1984 的回复:
ok谢谢老哥!
maradona1984 2020-04-14
  • 打赏
  • 举报
回复

import java.util.ArrayList;
import java.util.List;

import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.dubbo.rpc.cluster.Router;

/**
 * 同ip访问同一个服务
 *
 */
public class GrayscaleRouter implements Router, Comparable<Router> {

    private URL url;
    private final int priority;

    public GrayscaleRouter(URL url) {
        this.url = url;
        this.priority = url.getParameter(Constants.PRIORITY_KEY, 0);
    }

    @Override
    public int compareTo(Router o) {
        if (o == null || o.getClass() != GrayscaleRouter.class) {
            return 1;
        }
        GrayscaleRouter c = (GrayscaleRouter)o;
        return this.priority == c.priority ? url.toFullString().compareTo(c.url.toFullString())
            : (this.priority > c.priority ? 1 : -1);
    }

    @Override
    public URL getUrl() {
        return url;
    }

    @Override
    public <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL tempUrl, Invocation invocation)
        throws RpcException {
        String ip = RpcContext.getContext().getAttachment("client_ip");
        if (ip == null) {
            ip = System.getProperty("dubbo.protocol.host");
        }

        if (ip == null) {
            return excludeLocalService(invokers);
        } else {
            RpcContext.getContext().setAttachment("client_ip", ip);
        }
        List<Invoker<T>> result = new ArrayList<Invoker<T>>();
        for (Invoker<T> invoker : invokers) {
            if (ip.equals(invoker.getUrl().getIp())) {
                result.add(invoker);
            }
        }
        if (result.isEmpty()) {
            return excludeLocalService(invokers);
        }
        return result;
    }

    /**
     * 排除本地服务
     * 
     * @param invokers
     * @return
     */
    private <T> List<Invoker<T>> excludeLocalService(List<Invoker<T>> invokers) {
        List<Invoker<T>> result = new ArrayList<Invoker<T>>();
        invokers.forEach(invoker -> {
            String serviceIp = invoker.getUrl().getIp();
            if (!serviceIp.startsWith("10.")) {
                result.add(invoker);
            }
        });
        return result;
    }

    @Override
    public boolean equals(Object object) {
        return super.equals(object);
    }
    
    @Override
    public int hashCode(){
        return super.hashCode();
    }

}
swing wang 2020-04-14
  • 打赏
  • 举报
回复
如果有图有代码那最好不过 我也可以借鉴
swing wang 2020-04-14
  • 打赏
  • 举报
回复
引用 9 楼 maradona1984 的回复:
[quote=引用 8 楼 swing wang 的回复:] netflix 用的注册中心是尤里卡
我觉得可以考虑在网关层去做路由,当然我对spring cloud没多少研究,对其实现的技术细节不太清楚.[/quote] 嗯,我直觉在路由规则那里可以下手,可惜我源码阅读能力太差,想改造他的路由规则太难,还需要更加深入的研究下 你方便大概说下你们dubbo具体是怎么操作的吗?
maradona1984 2020-04-14
  • 打赏
  • 举报
回复
引用 8 楼 swing wang 的回复:
netflix 用的注册中心是尤里卡
我觉得可以考虑在网关层去做路由,当然我对spring cloud没多少研究,对其实现的技术细节不太清楚.
swing wang 2020-04-14
  • 打赏
  • 举报
回复
引用 6 楼 maradona1984 的回复:
[quote=引用 5 楼 swing wang 的回复:] [quote=引用 2 楼 maradona1984 的回复:] 我们是用dubbo,dubbo可以扩展路由指定路由到具体服务. 比如某个开发指定自己电脑的ip,路由会遍历所有服务,如果存在同样ip的(开发自己注册的服务ip),就只调用该ip的服务,如果没有就按正常调用,还有我们开发的ip有自己的ip段,如果属于这个ip段的ip注册的服务,是不会被除了前面说的那个场景之外的消费者调用到. 这样解决了几个问题 1.开发不用所有服务都启动 2.调用链不会串到别的开发机器上,影响正常测试功能. springCloud我就不太清楚了,当然也可以按照我这个思路来解决问题.
对,这个方案我最初也是考虑过的,但是不知道具体如何实现,想了很久最终不了了之了,不知道springcloud怎么支持这种方案[/quote]
引用 5 楼 swing wang 的回复:
[quote=引用 2 楼 maradona1984 的回复:] 我们是用dubbo,dubbo可以扩展路由指定路由到具体服务. 比如某个开发指定自己电脑的ip,路由会遍历所有服务,如果存在同样ip的(开发自己注册的服务ip),就只调用该ip的服务,如果没有就按正常调用,还有我们开发的ip有自己的ip段,如果属于这个ip段的ip注册的服务,是不会被除了前面说的那个场景之外的消费者调用到. 这样解决了几个问题 1.开发不用所有服务都启动 2.调用链不会串到别的开发机器上,影响正常测试功能. springCloud我就不太清楚了,当然也可以按照我这个思路来解决问题.
对,这个方案我最初也是考虑过的,但是不知道具体如何实现,想了很久最终不了了之了,不知道springcloud怎么支持这种方案[/quote] 你们是用哪一套的spring cloud呢?如果是spring cloud alibaba就毫无压力啊[/quote] netflix 用的注册中心是尤里卡
swing wang 2020-04-14
  • 打赏
  • 举报
回复
引用 4 楼 tianfang 的回复:
建立多个开发/测试环境 1 按组建立开发环境,争取不相互干扰。开发阶段(需要debug)的注册服务名增加个人特征字段 2 跨组的联合测试环境 3 内部测试环境(面向测试人员) 时间的节约比硬件开销价值多。开发用的测试服务器可以采用二手服务器或高端台式机,16G不够就32G,¥5000足够解决。一个这样的服务器才值几个人天
我们现在基本上就是尽量在自己机器上少启服务,少开浏览器,少开qq微信等不必要的程序以节省内存 如果联调时内存实在不够,就用公司公共的那台电脑帮着启几个服务 当然也可以加内存,32G相比人工费来讲不算啥 从领导层面讲,这个办法是当前最直接最有效的 但是从技术层面讲,这个明显不够优雅,2楼的方案就很符合技术人员的追求,可惜现在没找到springcloud的具体实现方案
maradona1984 2020-04-14
  • 打赏
  • 举报
回复
引用 5 楼 swing wang 的回复:
[quote=引用 2 楼 maradona1984 的回复:] 我们是用dubbo,dubbo可以扩展路由指定路由到具体服务. 比如某个开发指定自己电脑的ip,路由会遍历所有服务,如果存在同样ip的(开发自己注册的服务ip),就只调用该ip的服务,如果没有就按正常调用,还有我们开发的ip有自己的ip段,如果属于这个ip段的ip注册的服务,是不会被除了前面说的那个场景之外的消费者调用到. 这样解决了几个问题 1.开发不用所有服务都启动 2.调用链不会串到别的开发机器上,影响正常测试功能. springCloud我就不太清楚了,当然也可以按照我这个思路来解决问题.
对,这个方案我最初也是考虑过的,但是不知道具体如何实现,想了很久最终不了了之了,不知道springcloud怎么支持这种方案[/quote]
引用 5 楼 swing wang 的回复:
[quote=引用 2 楼 maradona1984 的回复:] 我们是用dubbo,dubbo可以扩展路由指定路由到具体服务. 比如某个开发指定自己电脑的ip,路由会遍历所有服务,如果存在同样ip的(开发自己注册的服务ip),就只调用该ip的服务,如果没有就按正常调用,还有我们开发的ip有自己的ip段,如果属于这个ip段的ip注册的服务,是不会被除了前面说的那个场景之外的消费者调用到. 这样解决了几个问题 1.开发不用所有服务都启动 2.调用链不会串到别的开发机器上,影响正常测试功能. springCloud我就不太清楚了,当然也可以按照我这个思路来解决问题.
对,这个方案我最初也是考虑过的,但是不知道具体如何实现,想了很久最终不了了之了,不知道springcloud怎么支持这种方案[/quote] 你们是用哪一套的spring cloud呢?如果是spring cloud alibaba就毫无压力啊
swing wang 2020-04-14
  • 打赏
  • 举报
回复
引用 2 楼 maradona1984 的回复:
我们是用dubbo,dubbo可以扩展路由指定路由到具体服务. 比如某个开发指定自己电脑的ip,路由会遍历所有服务,如果存在同样ip的(开发自己注册的服务ip),就只调用该ip的服务,如果没有就按正常调用,还有我们开发的ip有自己的ip段,如果属于这个ip段的ip注册的服务,是不会被除了前面说的那个场景之外的消费者调用到. 这样解决了几个问题 1.开发不用所有服务都启动 2.调用链不会串到别的开发机器上,影响正常测试功能. springCloud我就不太清楚了,当然也可以按照我这个思路来解决问题.
对,这个方案我最初也是考虑过的,但是不知道具体如何实现,想了很久最终不了了之了,不知道springcloud怎么支持这种方案
tianfang 2020-04-14
  • 打赏
  • 举报
回复
建立多个开发/测试环境 1 按组建立开发环境,争取不相互干扰。开发阶段(需要debug)的注册服务名增加个人特征字段 2 跨组的联合测试环境 3 内部测试环境(面向测试人员) 时间的节约比硬件开销价值多。开发用的测试服务器可以采用二手服务器或高端台式机,16G不够就32G,¥5000足够解决。一个这样的服务器才值几个人天
君择城 2020-04-14
  • 打赏
  • 举报
回复
可以采用内网搞一个服务注册中心,如果不同开发者启动同一个服务的话就设置不同的ip和server-applicaction-name+姓名拼音,可以解决服务冲突问题
maradona1984 2020-04-14
  • 打赏
  • 举报
回复
我们是用dubbo,dubbo可以扩展路由指定路由到具体服务. 比如某个开发指定自己电脑的ip,路由会遍历所有服务,如果存在同样ip的(开发自己注册的服务ip),就只调用该ip的服务,如果没有就按正常调用,还有我们开发的ip有自己的ip段,如果属于这个ip段的ip注册的服务,是不会被除了前面说的那个场景之外的消费者调用到. 这样解决了几个问题 1.开发不用所有服务都启动 2.调用链不会串到别的开发机器上,影响正常测试功能. springCloud我就不太清楚了,当然也可以按照我这个思路来解决问题.
  • 打赏
  • 举报
回复
请求接口的ip不同啊

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧