JAVA开发(保姆级微服务搭建过程)

2024-06-09 1532阅读

一、微服务的概念以及发展过程

微服务是指只提供一项功能的服务。 微服务是围绕某个业务领域展开的。比如把电商业务比较一个业务领域,技术部、产品部等就是围绕电商业务领域展开的微服务。在电商项目领域,由支付、商品、订单等微服务组成。

微服务架构风格是一类将单一应用程序作为由众多小型服务构成之套件加以开发的方式,其中各项服务都拥有自己的进程并利用轻量化机制(通常为HTTP源API)实现通信。这些服务围绕业务功能建立而成,且凭借自动化部署机制实现独立部署。

微服务将应用程序逻辑分为明确定义的职责范围的粒度组件,这些组件相互协调提供解决方案

每一个组件都有一个小的职责领域,可以完全部署,也就是说一个服务可以跨越多个应用程序复用。

服务之间通信基于一些基本的原则,比如服务采用http+json这样的轻量级通信协议,在不同服务之间进行数据交换。这样不同服务可以使用不同的技术栈,互不影响。

拆分为微服务之后,服务的数量变多,因此需要有统一的服务治理平台,来对各个服务进行管理。 

 

(一)、单体架构

   单体架构的缺点是 处理并发量有限,不能承载高并发量的访问。每个物理主机的吞吐量都是有限的,当并发量起来后,承载应用程序的服务器性能会下降,甚至可能宕机。要解决高并发问题,应用程序开始做集群。

(二)、单数据库多应用架构

  为了解决并发量的问题,开始对应用程序做集群,并使用nginx做负载均衡 。

 
 单数据库多应用架构,在应用程序上解决了并发量问题。随着并发量的增加,数据量也会骤增。数据量问题出现,数据库的性能下降,影响整个系统的性能。

(三)、微服务应用架构

 JAVA开发(保姆级微服务搭建过程)

二、微服务的优点

  • 每个服务都比较简单,只关注于一个业务功能。

  • 微服务架构方式是松耦合的,可以提供更高的灵活性。

  • 微服务可通过最佳及最合适的不同的编程语言与工具进行开发,能够做到有的放矢地解决针对性问题。

  • 每个微服务可由不同团队独立开发,互不影响,加快推出市场的速度。

  • 微服务架构是持续交付(CD)的巨大推动力,允许在频繁发布不同服务的同时保持系统其他部分的可用性和稳定性。

    1. 灵活性高:它将应用程序分解为小型服务(松散耦合),使其开发、维护更快,更易于理解,可以提供更高的灵活性;
    2. 独立扩展:它使每个服务能够独立扩展,将系统中的不同功能模块拆分成多个不同的服务,这些服务进行独立地开发和部署,每个服务都运行在自己的进程内,这样每个服务的更新都不会影响其他服务的运行;
    3. 支持多种编程语言:微服务可通过最佳及最合适的不同的编程语言与工具进行开发,能够做到有的放矢地解决针对性问题;
    4. 自动部署与持续集成工具集成:它允许以灵活的方式将自动部署与持续集成工具集成,例如Jenkins,Hudson等;
    5. 通用性:通过服务实现应用的组件化(按功能拆分、可独立部署和维护),围绕业务能力组织服务,根据业务不同的需求进行不同组件的使用,所做产品非项目化,对于平台具有一定的通用性。

    三、微服务得到拆分策略

    服务粒度的划分是伴随着架构演进进行的,需要考虑当前的人力、物力等来有效的统筹,在项目的初期可以把服务的粒度设计大一点,随着项目的不断壮大,团队的规模不断变大,可以对现有的粗粒度服务进行有效的拆分,逐步的向细粒度服务发展。
    基于业务逻辑进行拆分

    “职责范围”的理解差异很大,因此根据业务拆分需要权衡当前项目组的情况。
    基于可扩展拆分

    “日志服务”和“升级服务”放在同一个子系统中;不稳定的服务粒度可以细一些,但也不要太细,始终记住要控制服务的总数量。这样拆分主要是为了提升项目快速迭代的效率,避免在开发的时候,不小心影响了已有的成熟功能导致线上问题。
    基于可靠性拆分

    将系统中的业务模块按照优先级排序,将可靠性要求高的核心服务和可靠性要求低的非核心服务拆分开来,然后重点保证核心服务的高可用。这样拆分带来下面几个好处:(避免非核心服务故障影响核心服务、核心服务高可用方案可以更简单、能够降低高可用成本)
    基于性能拆分

    基于性能拆分和基于可靠性拆分类似,将性能要求高或者性能压力大的模块拆分出来,避免性能压力大的服务影响其他服务。常见的拆分方式和具体的性能瓶颈有关,可以拆分 Web 服务、数据库、缓存等。

    四、微服务搭建实战

    现在的java后端基本都是通过微服务的方式进行搭建。当我们对需求进行分割时,可以通过横向或者纵向对服务进行划分。或者当某一块的业务我们希望通过一个单独的服务进行开发时,就需要新增新的服务,本文通过springtool suite工具介绍,微服务搭建过程。

    1、现在的工程目录如下:

    JAVA开发(保姆级微服务搭建过程)

     我的工程为:ctg-blockchain-plat

    现在这个工程一共有4个微服务,分别为:

    hn-base-admin、hn-base-gateway、hn-blockchain-business、hn-member-business

    我们先看一下父工程的pom文件

    
        4.0.0
        
            org.springframework.boot
            spring-boot-starter-parent
            2.5.2
        
        cn.ctg
        ctg-member-plat
        pom
        1.0-SNAPSHOT
        
            8
            8
            1.0-SNAPSHOT
            1.8
            2020.0.3
            2.5.2
            8.0.17
            1.1.13
            3.4.3.4
            2.2.0
            1.8.0
            7.6.0.142
            1.2.83
            2.9.2
            5.7.7
            3.17
            3.8.1
            1.4.18
            2.15.0
            3.8.2
            3.3.0
            2.1
            1.66
            4.7.1
            1.0.3.2
            3.13.2
            5.6.89
            4.0.0-RC2
    		5.0.0-beta
        
        
           hn-base-common
           hn-base-gateway
           hn-base-admin
           hn-member-business
           hn-base-interceptor
           hn-blockchain-business
        
    

    再看一下一个子工程hn-blockchain-business的pom

    
    	4.0.0
    	
    	    ctg-member-plat
            cn.ctg
            1.0-SNAPSHOT
    	
    	hn-blockchain-business
    	jar
    	
    		
    			org.springframework.boot
    			spring-boot-starter
    		
     
    		
    			org.springframework.boot
    			spring-boot-starter-webflux
    		
    		
    			cn.ctg
    			hn-base-common
    			1.0-SNAPSHOT
    		
    		
    			cn.ctg
    			hn-base-interceptor
    			1.0-SNAPSHOT
    		
    		
    			org.postgresql
    			postgresql
    		
    		
    		
    			com.ctrip.framework.apollo
    			apollo-client
    			${apollo.version}
    		
    		
    			com.ctrip.framework.apollo
    			apollo-core
    			${apollo.version}
    		
    		
    			io.springfox
    			springfox-swagger2
    			${swagger2.version}
    		
    		
    			io.springfox
    			springfox-swagger-ui
    			${swagger2.version}
    		
    		
    			org.springframework.cloud
    			spring-cloud-starter-bootstrap
    		
    		
    			org.springframework.cloud
    			spring-cloud-starter-netflix-eureka-client
    			
    				
    					com.thoughtworks.xstream
    					xstream
    				
    			
    		
    		
    			com.thoughtworks.xstream
    			xstream
    			${xstream.version}
    		
    		
    			com.baomidou
    			mybatis-plus-boot-starter
    			${mybatisplus.version}
    		
    		
    			org.springframework.boot
    			spring-boot-starter-web
    		
    		
    			org.springframework.cloud
    			spring-cloud-starter-openfeign
    		
    		
    		
    			com.aliyun.oss
    			aliyun-sdk-oss
    			${aliyun-sdk-oss.version}
    		
    		
    		
    		
    			com.qcloud
    			cos_api
    			${cos_api.version}
    		
    		
            
                org.apache.rocketmq
                rocketmq-client
                ${rocketmq.version}
            
            
    		
    			 org.apache.rocketmq
    			 rocketmq-acl
    			 ${rocketmq.version}
    		
    		
    		
    		    com.aliyun.mq
    		    mq-http-sdk
    		    
    		    ${mq-http-sdk.version} 
    		    jar-with-dependencies
    		
    		
    		  
            
                mysql
                mysql-connector-java
                ${mysql.version}
            
    		
    		
    	   
    	   
    	
    	
    		
    			
    				org.springframework.cloud
    				spring-cloud-dependencies
    				${spring-cloud.version}
    				pom
    				import
    			
    		
    	
    	
    		${project.artifactId}
    		
    			
    				org.springframework.boot
    				spring-boot-maven-plugin
    			
    			
    				org.apache.maven.plugins
    				maven-surefire-plugin
    				
    					true
    				
    			
    			
    				maven-antrun-plugin
    				
    					
    						copy
    						package
    						
    							
    								
    									
    										
    									
    								
    							
    						
    						
    							run
    						
    					
    				
    			
    		
    	
    

    然后假设我们要新建一个新的服务hn-maoheyeren-business,右键ctg-blockchain-plat,选择maven,选择new maven module project

    JAVA开发(保姆级微服务搭建过程)

     出现下面对话框,在Module Name中填写hn-maoheyeren-business,依赖额父工程填写父工程中的artifactId :ctg-member-plat ,工作目录 working set 选择项目的工作目录。

    JAVA开发(保姆级微服务搭建过程)

     点击next,选择maven 快速架构类型,点击next

    JAVA开发(保姆级微服务搭建过程)

     点击next,再点击finish

    JAVA开发(保姆级微服务搭建过程)

     微服务模块就生成了:

    JAVA开发(保姆级微服务搭建过程)

    我们看一下pom

    
      4.0.0
      
        cn.ctg
        ctg-member-plat
        1.0-SNAPSHOT
      
      cn.ctg
      hn-maoheyeren-business
      1.0-SNAPSHOT
      hn-maoheyeren-business
      http://maven.apache.org
      
        UTF-8
      
      
        
          junit
          junit
          3.8.1
          test
        
      
    
    

     然后我们需要改一下微服务的pom,我们可以把hn-blockchain-business的pom复制过来改一下。

    
    	4.0.0
    	
    	    ctg-member-plat
            cn.ctg
            1.0-SNAPSHOT
    	
    	hn-maoheyeren-business
    	jar
    	
    		
    			org.springframework.boot
    			spring-boot-starter
    		
     
    		
    			org.springframework.boot
    			spring-boot-starter-webflux
    		
    		
    			cn.ctg
    			hn-base-common
    			1.0-SNAPSHOT
    		
    		
    			cn.ctg
    			hn-base-interceptor
    			1.0-SNAPSHOT
    		
    		
    			org.postgresql
    			postgresql
    		
    		
    		
    			com.ctrip.framework.apollo
    			apollo-client
    			${apollo.version}
    		
    		
    			com.ctrip.framework.apollo
    			apollo-core
    			${apollo.version}
    		
    		
    			io.springfox
    			springfox-swagger2
    			${swagger2.version}
    		
    		
    			io.springfox
    			springfox-swagger-ui
    			${swagger2.version}
    		
    		
    			org.springframework.cloud
    			spring-cloud-starter-bootstrap
    		
    		
    			org.springframework.cloud
    			spring-cloud-starter-netflix-eureka-client
    			
    				
    					com.thoughtworks.xstream
    					xstream
    				
    			
    		
    		
    			com.thoughtworks.xstream
    			xstream
    			${xstream.version}
    		
    		
    			com.baomidou
    			mybatis-plus-boot-starter
    			${mybatisplus.version}
    		
    		
    			org.springframework.boot
    			spring-boot-starter-web
    		
    		
    			org.springframework.cloud
    			spring-cloud-starter-openfeign
    		
    		
    		
    			com.aliyun.oss
    			aliyun-sdk-oss
    			${aliyun-sdk-oss.version}
    		
    		
    		
    		
    			com.qcloud
    			cos_api
    			${cos_api.version}
    		
    		
            
                org.apache.rocketmq
                rocketmq-client
                ${rocketmq.version}
            
            
    		
    			 org.apache.rocketmq
    			 rocketmq-acl
    			 ${rocketmq.version}
    		
    		
    		
    		    com.aliyun.mq
    		    mq-http-sdk
    		    
    		    ${mq-http-sdk.version} 
    		    jar-with-dependencies
    		
    		
    		  
            
                mysql
                mysql-connector-java
                ${mysql.version}
            
    		
    		
    	   
    	   
    	
    	
    		
    			
    				org.springframework.cloud
    				spring-cloud-dependencies
    				${spring-cloud.version}
    				pom
    				import
    			
    		
    	
    	
    		${project.artifactId}
    		
    			
    				org.springframework.boot
    				spring-boot-maven-plugin
    			
    			
    				org.apache.maven.plugins
    				maven-surefire-plugin
    				
    					true
    				
    			
    			
    				maven-antrun-plugin
    				
    					
    						copy
    						package
    						
    							
    								
    									
    										
    									
    								
    							
    						
    						
    							run
    						
    					
    				
    			
    		
    	
    

    最后新增一下资源文件,配置服务的端口信息等。

    bootstrap.yml

    #应用ID
    app:
      id: ctg-member-plat
    #应用端口
    server:
      port: 9003
    #服务名称
    spring:
      application:
        name:  hn-maoheyeren-business
      servlet:
        multipart:
          max-file-size: 1024MB #指定上传文件允许的最大大小。 默认值为1MB
          max-request-size: 10240MB #指定multipart/form-data请求允许的最大大小。 默认值为10MB。
    #配置注册中心
    eureka:
      instance:
        prefer-ip-address: true
        instance-id: ${spring.cloud.client.ip-address}:${server.port}
      client:
        service-url:
          defaultZone: ${eureka.defaultZone} #服务注册到的地址
          fetch-registry: true
    #阿波罗配置信息
    apollo:
      bootstrap:
        enabled: true
        namespaces: application,txyunjdbc.yml,redis.yml
      meta: http://member-config:8080
    mybatis:
      #mapper配置文件
      mapper-locations: classpath:mapper/*.xml
      #开启驼峰命名法
      configuration:
        map-underscore-to-camel-case: true
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      mybatis-plus:
        configuration:
          # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
          log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      global-config:
        db-config:
          id-type: ASSIGN_UUID
    #日志级别配置信息
    logging:
      level:
        root: INFO
        cn.ctg.member.dao: DEBUG

    最后给在网关中配置一下微服务的转发路径,就可以进行开发了 。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]