nacos2,2024年最新kafka并发消费原理

3、添加postgresql依赖,需要修改的地方有3处,顶级pom.xml,nacos-config以及nacos-naming的pom.xml,顶级pom是在dependencyManagement部分添加,pg版本根据自己项目实际情况修改


<dependency>

    <groupId>org.postgresql</groupId>

    <artifactId>postgresql</artifactId>

    <version>42.2.14</version>

</dependency>

nacos-config以及nacos-naming只需添加postgresql依赖即可,不用再关注pg版本


<dependency>

    <groupId>org.postgresql</groupId>

    <artifactId>postgresql</artifactId>

</dependency>

4、修改nacos-config模块的ExternalDataSourceProperties类build方法


    List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) {

        List<HikariDataSource> dataSources = new ArrayList<>();

        Binder.get(environment).bind("db", Bindable.ofInstance(this));

        Preconditions.checkArgument(Objects.nonNull(num), "db.num is null");

        Preconditions.checkArgument(CollectionUtils.isNotEmpty(user), "db.user or db.user.[index] is null");

        Preconditions.checkArgument(CollectionUtils.isNotEmpty(password), "db.password or db.password.[index] is null");

        for (int index = 0; index < num; index++) {

            int currentSize = index + 1;

            Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index);

            DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment);

            // 支持postgresql与mysql,POSTGRES_JDBC_DRIVER_NAME为org.postgresql.Driver的常量

            String driverClassName = JDBC_DRIVER_NAME;

            if ("postgresql".equals(EnvUtil.getProperty("spring.datasource.platform"))) {

                driverClassName = POSTGRES_JDBC_DRIVER_NAME;

            }

5、修改nacos-config模块的PropertyUtil类loadSetting方法,修改后为


private void loadSetting() {

        try {

            setNotifyConnectTimeout(Integer.parseInt(EnvUtil.getProperty("notifyConnectTimeout", "100")));

            LOGGER.info("notifyConnectTimeout:{}", notifyConnectTimeout);

            setNotifySocketTimeout(Integer.parseInt(EnvUtil.getProperty("notifySocketTimeout", "200")));

            LOGGER.info("notifySocketTimeout:{}", notifySocketTimeout);

            setHealthCheck(Boolean.parseBoolean(EnvUtil.getProperty("isHealthCheck", "true")));

            LOGGER.info("isHealthCheck:{}", isHealthCheck);

            setMaxHealthCheckFailCount(Integer.parseInt(EnvUtil.getProperty("maxHealthCheckFailCount", "12")));

            LOGGER.info("maxHealthCheckFailCount:{}", maxHealthCheckFailCount);

            setMaxContent(Integer.parseInt(EnvUtil.getProperty("maxContent", String.valueOf(maxContent))));

            LOGGER.info("maxContent:{}", maxContent);

            // 容量管理

            setManageCapacity(getBoolean("isManageCapacity", isManageCapacity));

            setCapacityLimitCheck(getBoolean("isCapacityLimitCheck", isCapacityLimitCheck));

            setDefaultClusterQuota(getInt("defaultClusterQuota", defaultClusterQuota));

            setDefaultGroupQuota(getInt("defaultGroupQuota", defaultGroupQuota));

            setDefaultTenantQuota(getInt("defaultTenantQuota", defaultTenantQuota));

            setDefaultMaxSize(getInt("defaultMaxSize", defaultMaxSize));

            setDefaultMaxAggrCount(getInt("defaultMaxAggrCount", defaultMaxAggrCount));

            setDefaultMaxAggrSize(getInt("defaultMaxAggrSize", defaultMaxAggrSize));

            setCorrectUsageDelay(getInt("correctUsageDelay", correctUsageDelay));

            setInitialExpansionPercent(getInt("initialExpansionPercent", initialExpansionPercent));

            // External data sources are used by default in cluster mode

            // 支持postgresql与mysql

            String platfrom = getString("spring.datasource.platform", "");

            setUseExternalDB("mysql".equalsIgnoreCase(platfrom) || "postgresql".equalsIgnoreCase(platfrom));



6、修改nacos-core模块的StartingApplicationListener类judgeStorageMode方法,修改后如下所示:


    private void judgeStorageMode(ConfigurableEnvironment env) {



        // External data sources are used by default in cluster mode

        // 修改为支持postgresql与mysql

        String platform = env.getProperty("spring.datasource.platform", "");

        boolean useExternalStorage = ("mysql".equalsIgnoreCase(platform) || "postgresql".equalsIgnoreCase(platform));



7、修改nacos-config模块GroupCapacityPersistService类insertGroupCapacity方法,修改后如下所示:


    private boolean insertGroupCapacity(final String sql, final GroupCapacity capacity) {

        try {

            GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

            PreparedStatementCreator preparedStatementCreator = new PreparedStatementCreator() {

                @Override

                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {

                    //修改为支持postgresql与mysql

                    PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});

8、修改nacos-config模块TenantCapacityPersistService类的insertTenantCapacity方法,修改后如下所示:


    public boolean insertTenantCapacity(final TenantCapacity tenantCapacity) {

        final String sql =

                "INSERT INTO tenant_capacity (tenant_id, quota, `usage`, `max_size`, max_aggr_count, max_aggr_size, "

                        + "gmt_create, gmt_modified) SELECT ?, ?, count(*), ?, ?, ?, ?, ? FROM config_info WHERE tenant_id=?;";

        try {

            GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

            PreparedStatementCreator preparedStatementCreator = new PreparedStatementCreator() {

                @Override

                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {

                    PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});

9、修改nacos-config模块ExternalStoragePersistServiceImpl类的addConfigInfoAtomic方法,修改后如下所示:


    public long addConfigInfoAtomic(final long configId, final String srcIp, final String srcUser,

            final ConfigInfo configInfo, final Timestamp time, Map<String, Object> configAdvanceInfo) {

        final String appNameTmp =

                StringUtils.isBlank(configInfo.getAppName()) ? StringUtils.EMPTY : configInfo.getAppName();

        final String tenantTmp =

                StringUtils.isBlank(configInfo.getTenant()) ? StringUtils.EMPTY : configInfo.getTenant();



        final String desc = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get("desc");

        final String use = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get("use");

        final String effect = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get("effect");

        final String type = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get("type");

        final String schema = configAdvanceInfo == null ? null : (String) configAdvanceInfo.get("schema");



        final String md5Tmp = MD5Utils.md5Hex(configInfo.getContent(), Constants.ENCODE);



        KeyHolder keyHolder = new GeneratedKeyHolder();



        final String sql =

                "INSERT INTO config_info(data_id,group_id,tenant_id,app_name,content,md5,src_ip,src_user,gmt_create,"

                        + "gmt_modified,c_desc,c_use,effect,type,c_schema) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";



        try {

            jt.update(new PreparedStatementCreator() {

                @Override

                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {

                    // 支持postgresql与mysql

                    PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});

10、修改nacos-config模块ExternalStoragePaginationHelperImpl类的fetchPage方法,修改后如下所示:


    public Page<E> fetchPage(final String sqlCountRows, final String sqlFetchRows, final Object[] args,

            final int pageNo, final int pageSize, final Long lastMaxId, final RowMapper rowMapper) {

        if (pageNo <= 0 || pageSize <= 0) {

            throw new IllegalArgumentException("pageNo and pageSize must be greater than zero");

        }



        // Query the total number of current records.

        Integer rowCountInt = jdbcTemplate.queryForObject(sqlCountRows, args, Integer.class);

        if (rowCountInt == null) {

            throw new IllegalArgumentException("fetchPageLimit error");

        }



        // Compute pages count

        int pageCount = rowCountInt / pageSize;

        if (rowCountInt > pageSize * pageCount) {

            pageCount++;

        }



        // Create Page object

        final Page<E> page = new Page<E>();

        page.setPageNumber(pageNo);

        page.setPagesAvailable(pageCount);

        page.setTotalCount(rowCountInt);



        if (pageNo > pageCount) {

            return page;

        }



        final int startRow = (pageNo - 1) * pageSize;

        String selectSql = "";

        if (isDerby()) {

            selectSql = sqlFetchRows + " OFFSET " + startRow + " ROWS FETCH NEXT " + pageSize + " ROWS ONLY";

        } else if (lastMaxId != null) {

            selectSql = sqlFetchRows + " and id > " + lastMaxId + " order by id asc" + " limit " + 0 + "," + pageSize;

        } else {

            // 修改为支持postgresql,同时兼容mysql8

            selectSql = sqlFetchRows + " limit " + pageSize + " offset " + startRow;

        }

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

image.png

  • RabbitMQ实战指南

image.png

  • 手写RocketMQ笔记

image.png

  • 手写“Kafka笔记”

image

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

(img-w9q2P9Nt-1712660360608)]

  • 手写“Kafka笔记”

[外链图片转存中…(img-bd6qdWcL-1712660360608)]

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Cw1Lj0lp-1712660360609)]

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值