java代码生成器集成dubbo,springcloud详解以及微服务遐想

news2024/10/17 6:50:38

摘要

  今天终于有了点空闲时间,所以更新了一下代码生成器,修复了用户反馈的bug,本次更新主要增加了dubbo和springcloud脚手架的下载功能,架子是本人亲自搭建,方便自由扩展或者小白学习使用,你也许会问为什么它们不能像springboot一样通过配置的方式生成项目,我只能回答:理论上是可以的,以后有时间会摸索可行之道,但是我觉得微服务框架业务复杂多变,不如直接使用脚手架自由扩展来的方便,所以目前是采用了这样一种方式。本篇博客将具体介绍脚手架每个部分的功能模块,然后畅想一下微服务技术的未来发展趋势。

dubbo脚手架

  dubbo曾经风靡一时,但是逐步被springcloud所替代,所以dubbo的脚手架我做的相对简易,以表缅怀之情。
  代码生成器获取dubbo脚手架十分简单,如下:

dubbo

  鼠标点击一下便可自动下载到桌面
拉取dubbo

  然后看一下脚手架的目录结构:
dubbo目录

  项目导入到了idea当中,因为dubbo需要zookeeper依赖,所以需要配置zookeeper注册中心,相信你可以自己解决~
  具体的细节请参考我的 dubbo+zookeeper对比springCloud及分布式项目搭建详解此篇博客,这个脚手架就是博客当中讲述的demo项目。

springcloud脚手架

  把springcloud脚手架下载下来导入到idea当中,项目结构如下:


springcloud

  下面对每个module的配置进行简要讲解,其他的细节读者可以使用生成器下载自行查看。

cloud_eureka模块

  此模块主要负责服务发现注册,相当于dubbo的zookeeper,只不过springCloud使用eureka来进行服务的发现和注册,相信大家都知道CAP原则,即一致性,可用性和分区容错性,只要是分布式项目,一般都具备分区容错性(简单理解,一个节点挂了,其他节点可以正常提供服务)。
  zookeeper本身就不是为高可用设计的,节点之间的数据会保持高度的同步,并且一旦发生网络隔离,zookeeper内部会进行master选举,这个选举流程是十分缓慢的,长达30到120秒,对于一个要不断向外界提供服务的系统来说,这将是非常致命的!所以dubbo+zookeeper总体来说符合CP原则。
  springcloud的服务注册中心eureka则不同,eureka每个节点都是平等的,不会有选举master节点这一说法,并且本身具有自我保护机制,具备服务的高度可用性,相对的,它无法做到数据的强一致,也就是无法保证在每个节点上始终获取的都是最新的数据,但我们可以在程序设计的时候保证结果的最终一致性。所以springcloud总体来说符合AP原则。
  让我们看一下cloud_eureka的yml配置,如下:通过加载不同的yml,就可以分别启动server1和server2构成eureka集群,负责服务发现和注册的职责。
  application.yml:

#注册中心应用名称
spring:
  application:
    name: eureka-server
#使用的配置文件名 `java -jar -Dspring.profiles.active=serverX demo.jar`启动serverX配置
  profiles:
    active: server1

  application-server1.yml:

#注册中心运行的端口号
server:
  port: 8001
#注册中心应用名称
#spring:
#  application:
#      name: eureka-server
#eureka.server.enableSelfPreservation:是否向注册中心注册自己
#通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server.
eureka:
# 自我保护机制
  #server:
     #enableSelfPreservation: false #关闭eureka的自我保护 小规模项目关闭比较好
     #eviction-interval-timer-in-ms: 5000 #清理间隔时间,单位为毫秒(默认值60 * 1000)
     #use-read-only-response-cache: false
  instance:
      hostname: server1
      prefer-ip-address: false
#      ip-address: 172.193.225.185
#      instance-id: ${spring.cloud.client.ipAddress}:${server.port}
  client:
      fetch-registry: true 
      register-with-eureka: true 
      service-url:
           defaultZone: http://server2:8002/eureka/

  application-server2.yml:

#注册中心运行的端口号
server:
  port: 8002
#注册中心应用名称
#spring:
#  application:
#      name: eureka-server
#eureka.server.enableSelfPreservation:是否向注册中心注册自己
#通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server.
eureka:
# 自我保护机制
  #server:
     #enableSelfPreservation: false #关闭eureka的自我保护 小规模项目关闭比较好
     #eviction-interval-timer-in-ms: 3000 #清理间隔时间,单位为毫秒(默认值60 * 1000)
     #use-read-only-response-cache: false
  instance:
      hostname: server2
      prefer-ip-address: false
#      ip-address: 172.193.225.185
#      instance-id: ${spring.cloud.client.ipAddress}:${server.port}
  client:
      fetch-registry: true 
      register-with-eureka: true 
      service-url:
           defaultZone: http://server1:8001/eureka/

cloud_zuul模块

  此模块是所有微服务的网关,这里采用的是zuul,现在spring官方逐渐放弃了zuul,而是采用了自己的gateway网关组件,因为zuul是io阻塞的,但在配置上可以类比zuul的配置。网关组件也是需要在eureka中进行注册的。
  application.yml如下,ribbon和hystrix的超时时间需要特别配置一下,不然项目启动之后第一次通过网关访问服务大概率会报hystrix timeout的超时错误(默认超时时间很短),ribbon负责负载均衡,hystrix负责服务熔断,所以配置上服务熔断的时间应该大于负载均衡的总时间,否则会一直有warn提示。
服务熔断的超时时间计算公式如下:
(1+MaxAutoRetries + MaxAutoRetriesNextServer)* ReadTimeout,加1是因为首次访问不计入重试次数,MaxAutoRetries为同一台实例最大调用次数,默认为1,MaxAutoRetriesNextServer为切换其他实例的最大次数,默认为1,所以熔断器的超时时间要大于重试时间,不然重试就失去了意义,这里通过计算超时时间为20000,所以hystrix的超时时间设置为比20000稍大的30000即可。

#网关
spring:
  application:
    name: cloud-zuul
eureka:
  client:
    service-url:
      defaultZone: http://server1:8001/eureka/,http://server2:8002/eureka/
  instance:
    prefer-ip-address: true
server:
  port: 7001
zuul:
  routes:
    cloud-service1: #测试service1
      path: /service1/**
      serviceId: cloud-service1
    cloud-service2: #测试service1
      path: /service2/**
      serviceId: cloud-service2
  host:
    connect-timeout-millis: 15000
    socket-timeout-millis: 10000

ribbon:
  ConnectTimeout: 5000
  ReadTimeout: 5000

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 30000

cloud_config模块

  此模块为springcloud配置中心,可以从远程git仓库拉取配置文件,同时它不需要注册到eureka当中。
  application.yml内容如下:rabbitmq的配置主要是实现服务总线的作用。用户向config发送http://localhost:6001/actuator/bus-refresh请求,config会向rabbitmq发送配置更新的消息,同时配置了服务总线的微服务模块会监听到此消息,就会重新从远程拉取配置文件并重新加载,这样我们在远程仓库修改了配置文件无需重启项目就可以实现配置的更新。

server:
  port: 6001
spring:
  application:
    name: cloud-config
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/zrxjava/cloudModel_config.git
  rabbitmq:
    host: 127.0.0.1
    username: guest
    password: guest
#刷新总线的接口
management:
  endpoints:
    jmx:
      exposure:
        exclude: bus-refresh

cloud_service1模块

  service1为其中的一个微服务模块,同时它也注册在eureka当中,在service1中,使用了feign来调用service2,我们知道,微服务可以通过ribbon和feign来调用,不同的是,ribbon采用restTemplate的方式调用,feign则是把ribbon封装了一层,采用接口形式调用,并且默认支持负载均衡,同时也可选择开启服务熔断,feign客户端代码如下:

package consumer.client;

import consumer.client.impl.Service2ClientImpl;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;

@Component //仅仅是为了屏蔽idea误显示的注入错误
@FeignClient(value = "cloud-service2", fallback = Service2ClientImpl.class)
public interface Service2Client {

    @GetMapping("/test/do")
    public String test();

}
package consumer.client.impl;

import consumer.client.Service2Client;
import org.springframework.stereotype.Component;

//熔断器执行的方法
@Component
public class Service2ClientImpl implements Service2Client {


    @Override
    public String test() {
        return "触发熔断器!";
    }
}

  service1的配置文件通过config配置中心管理,启动service1的时候会加载bootstrap.yml的配置,从gitee上拉取配置文件,config配置中心主要是为了方便运维,配置上springcloud-bus后可以无需重启项目加载配置文件,实乃运维之福音。bootstrap.yml内容如下:

spring:
  cloud:
    config:
      name: service1 #对应git服务器上的name #name-profile
      profile: dev #对应git服务器上的profile
      label: master #提交到master分支
      uri: http://localhost:6001 #config的访问地址

  gitee仓库service-dev.yml内容如下:

#注册中心应用名称
spring:
  application:
    name: cloud-service1
  rabbitmq:
      host: 127.0.0.1
      username: guest
      password: guest
eureka:
  client:
    service-url:
      defaultZone: http://server1:8001/eureka/,http://server2:8002/eureka/
  instance:
    prefer-ip-address: true
server:
  port: 9001
feign:
  hystrix:
    enabled: true
ribbon:
  ConnectTimeout: 5000
  ReadTimeout: 5000

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 30000

cloud_service2模块

  service2跟service1同样注册进了eureka中,同时也仅仅是注册进入了eureka中供service1调用,在真实的项目当中,每个微服务是可以互相调用的,只是我在这里偷了个懒,没有配置feign的客户端调用,也就是说,它同样可以调用service1。
  application.yml如下:

#注册中心应用名称
spring:
  application:
    name: cloud-service2
eureka:
  client:
    service-url:
      defaultZone: http://server1:8001/eureka/,http://server2:8002/eureka/
  instance:
    prefer-ip-address: true
server:
  port: 9002

测试

  首先我们启动两个eureka构成集群,分别使用server1和server2文件启动项目(先启动的一方由于另一方没有启动会报错,当另一方启动完毕报错即会自动消失,因为两方是互相注册形成高可用集群),启动完毕后,访问http://localhost:8001/即可看到server1界面,如下:

eureka-server1

  同样,server2也是可以正常访问的,这里就不再截图了。
  接下里启动配置中心,注意service1的yml需要通过config远程获取,所以需要先启动配置中心config,然后再分别启动service1和service2,最后启动zuul。如果没有配置rabbitmq,启动config和service1会报错失败(提示无法连接rabbitmq服务),不启动它们也可。全部启动完毕后,发现eureka注册中心已经有了各自的服务注册信息,如图:
启动完毕

  如上图,我们成功启动了两个service微服务和zuul服务网关。在这里eureka界面的红色字体是由于eureka的自我保护机制触发的,并不是报错,当eureka收到的最后一分钟服务实例续约的总数/每分钟期望收到的续约数<85%的时候,便会触发自我保护机制告诉你可能有节点出了问题(比如网络延迟,并不是服务真的挂了),但是它不会去剔除它,会保留其注册信息,等到节点恢复正常仍然可以继续工作,这样使得整个服务更加高可用。
  最后我们通过zuul网关地址访问service1的服务(service1会通过feign调用service2),访问 http://localhost:7001/service1/test/do(如果没有启动config和service1,访问 http://localhost:7001/service2/test/do),如下:
结果

  这样一来,整个流程就结束了,springcloud的核心组件也就讲解完毕。

微服务遐想

  值得一提的是,在真实的微服务项目中,服务的数量远远不止这些,代码生成器也只是帮助你搭建了基本的架构模型。所以如果通过人工部署管理的方式会变得异常困难,但后来随着容器化技术的发展,通过dockerfile把每个服务生成镜像在dokcer容器中运行渐渐成为一种主流的部署运维方式,并且通过maven插件可以一键构建dockerfile文件生成镜像并上传至docker私服,通过docker私服便可以上传我们自己的微服务镜像文件并十分方便的运行它们,通过jenkins持续集成,同时也让微服务发布更加的容易,最后为了统一管理docker容器,k8s超过docker swarm成为容器化应用的新一代宠儿,时代在飞速发展,技术的迭代也同样迅速!
  前阵子跟朋友微信闲聊,了解到Service Mesh技术正在悄然兴起,大厂已经有了落地应用,简单理解,service mesh把每个微服务做了进一步的解耦,把通信相关的操作(负载均衡,断路器等)抽离了出来,为每个微服务生成了一个代理服务,而微服务做到了真正只需要关心业务。以前的微服务是单轮车,现在变成了双轮车,所以有人也称它为“边车模式“,把每个代理服务用线连接起来,组成了一个错综复杂的网格,service mesh也就由此而来,后来演化出了集中式的控制面板来管理一个个的网格,代表作品:Istio。
  但同样的,由于service mesh接管了网络流量,系统的稳定性就会依赖于service mesh,同时相比之前,额外引入的大量service mesh实例对运维和管理来说也是一个巨大的挑战。
  service mesh是未来微服务的发展趋势,历史也总是惊人的相似,最开始的时候,人们为了解决端到端的通信问题,tcp协议横空出世,多机通信从此变得简单可靠。如今我们来到了微服务时代,为了屏蔽分布式系统的通信复杂性,service mesh应运而生。这让我们回归业务,聚焦真正的价值!

代码生成器:点击下载



喜欢的朋友记得点赞、收藏、关注哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红日安全vulnstack (二)

目录 环境搭建 网卡设置 修改Kali网段 IP 分布 WEB渗透 Weblogin服务开启 漏洞扫描 CVE工具利用 MSF上线 内网渗透 域内信息收集 凭证横向移动 权限维持 黄金票据 参考文章 https://www.cnblogs.com/bktown/p/16904232.htmlhttps://blog.csdn.net/m0_75178803/ar…

leetcode54:螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,…

hackmyvm-Hundred靶机

主机发现 sudo arp-scan -l 以sudo权限执行arp-scan -l 扫描并列出本地存在的机器&#xff0c;发现靶机ip为192.168.91.153 nmap扫描 端口发现 21/tcp open ftp 22/tcp open ssh 80/tcp open http web信息收集 我们先尝试一下ftp端口的匿名登录 FTP:是文件传输协议的端…

个人博客系统_测试报告

1.项目背景 基于SSM框架实现的个人博客系统&#xff0c;由五个页面构成&#xff1a;用户登录页、博客发表页、博客编辑页、博客列表页以及博客详情页。登录即可查看自己与其他用户已发布的博客&#xff0c;也可以使用自己的账号发布博客&#xff0c;通过使用Selenium定位web元…

《人工智能:CSDN 平台上的璀璨之星》

一、CSDN 上的 AI 热门话题 GPT-3 作为 CSDN 上的热门话题&#xff0c;其应用极为广泛。GPT-3 是 OpenAI 开发的一种基于 Transformer 架构的大规模预训练语言模型&#xff0c;拥有惊人的 1750 亿个参数。它具有多任务处理能力&#xff0c;能够执行多种自然语言处理任务&#x…

保护企业终端安全,天锐DLP帮助企业智能管控终端资产

为有效预防员工非法调包公司的软硬件终端资产&#xff0c;企业管理员必须建立高效的企业终端安全管控机制&#xff0c;确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统&#xff0c;确保任何未经授权的资产变动都能被迅…

Ajax处理错误信息(处理响应报文)

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><form action""><div>用户名<input type"text" class"username"></div>…

【2024-10-16】某小破站w_rid参数分析

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、参数分析三、代码一、前言 看一下小破站的参数加密 网址: aHR0cHM6Ly9zcGFjZS5iaWxpYmlsaS5jb20vNDA1Nz…

c++就业1.1.3海量数据去重的Hash与BloomFilter

找到具体的位置 通过映射 当前需要插入的指向 上一层最后一个 方便头插 布隆过滤器 - 查找是否有这个值 但是不能够返回value 服务器和过滤器进行网络交互 我们要知道这个key在不在mysql中 去查询并且在mysql中进行查询 所以在服务器部署布隆过滤器 为了节约内存 用位图 对str…

Linux权限理解及环境基础开发工具使用

前言 Linux中有两种用户&#xff0c;一种是root用户&#xff0c;另一种是普通用户&#xff0c;二者的权限不一样&#xff0c;即能做的事情不一样。下面我们来细讲一下这些不同。 root用户能在Linux系统下做任何事情&#xff0c;而普通用户只能做有限的事情。 root用户的命令…

FPGA采集adc,IP核用法,AD驱动(上半部分)

未完结&#xff0c;明天补全 IP核&#xff1a;集成的一个现有的模块 串口写好后基本不会再修改串口模块内部的一些逻辑&#xff0c;将串口.v文件添加进来&#xff0c;之后通过他的上层的接口去对他进行使用&#xff0c;所以我们打包IP&#xff0c;之后就不用去添加源文件了&a…

Pollard‘s p-1算法

概述 光滑数 (Smooth number)&#xff1a;指可以分解为多个小素数乘积的正整数 当p是N 的因数&#xff0c;并且p−1是光滑数&#xff0c;可以考虑使用Pollards p-1算法来分解N 当p是N的因数&#xff0c;并且p1是光滑数&#xff0c;可以考虑使用Williamss p1算法来分解N 这里…

Java 快速排序算法详解及通用实现模板案例示范

1. 引言 在众多排序算法中&#xff0c;快速排序&#xff08;QuickSort&#xff09; 是一种非常经典且高效的算法。它采用“分治法”的策略&#xff0c;通过递归地将数组分割成更小的部分&#xff0c;从而快速完成排序操作。快速排序的平均时间复杂度为 O(n log n)&#xff0c;…

webpack 学习入门

webpack 1. 简介1.1 webpack 是什么1.2 webpack 五个核心概念1.2.1 入口 - Entry1.2.2 出口 - Output1.2.3 Loader1.2.4 插件 - Plugins1.2.6 模式 - Mode 2. webpack 初体验2.1 初始化配置2.1.1. 准备2.1.2. 写代码2.1.3 编译打包应用 3. webpack 开发环境的基本配置3.1 打包样…

《深度学习》OpenCV EigenFaces算法 人脸识别

目录 一、EigenFaces算法 1、什么是EigenFaces算法 2、原理 3、实现步骤 1&#xff09;数据预处理 2&#xff09;特征提取 3&#xff09;构建模型 4&#xff09;识别 4、优缺点 1&#xff09;优点 2&#xff09;缺点 二、案例实现 1、完整代码 运行结果&#xff…

大学新生编程入门指南:如何选择编程语言与制定学习计划

大学新生编程入门指南&#xff1a;如何选择编程语言与制定学习计划 编程已成为当代大学生的必备技能&#xff0c;尤其是在信息技术高速发展的今天&#xff0c;编程能力不仅能帮助你在课堂学习中脱颖而出&#xff0c;更能为未来职业生涯打下坚实的基础。然而&#xff0c;面对如…

The 48 bit pointer

在 Intel CPU 和 Arm CPU 中&#xff0c;用户空间的指针地址默认都只使用低 48 位&#xff0c;高16 位总是 0。 写一小段代码验证下&#xff1a; #include <stdio.h> #include <memory.h> #include <stdlib.h>void o(long long ptr) {printf("%016p: &…

如何通过CDN优化网站服务器访问速度?

CDN&#xff0c;即内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;在现代互联网中起着重要作用。它可以显著提升网站服务器的访问速度。以下是CDN在加速网站访问方面的主要优势及其工作原理。 1. 全球分布的服务器节点 CDN通过在全球范围内布设多个…

mysql的重置

今天用Navicat16去连接mysql突然就连不上了。一直报错 连接本地mysql时出现2003-Can‘t connect to MySql server on ‘localhost‘(10061)错误。 以为是Navicat过期了。正好Navicat推出了Lite 17免费版本&#xff0c;心想正好可以尝尝鲜&#xff0c;而且还支持连接Redis&#…

C++:Boost的安装和使用

1、Boost简介 Boost的本质就是一个开源C库&#xff0c;它包含多种功能强大的模块&#xff0c;如&#xff1a;字符串文本处理模块、容器、算法、多线程、智能指针、线程池等模块 2、Boost的下载和安装 &#xff08;1&#xff09;Boost下载 官网&#xff1a;http://www.boost…