通向架构师的道路(第二十天)万能框架spring(二)maven结合spring与ibatis

简介: 一、前言 上次讲了Struts结合Spring并使用Spring的JdbcTemplate来搭建工程框架后我们面临着jar库无法管理,工程发布不方便,jar包在工程内太占空间,jar包冲突,管理,甚至漏包都问题。

一、前言

上次讲了Struts结合Spring并使用Spring的JdbcTemplate来搭建工程框架后我们面临着jar库无法管理,工程发布不方便,jar包在工程内太占空间,jar包冲突,管理,甚至漏包都问题。于是我们在讲“万能框架spring(二)”前,传授了一篇番外篇,即讲利用maven来管理我们的jar库。

从今天开始我们将结合“万能框架spring(一)”与番外篇maven来更进一步丰富我们的ssx框架,那么今天讲的是使用iBatis3结合SS来构建我们的ssi框架,我们把这个框架命名为beta吧。

二、SSI框架


还记得我们在第十八天中讲到的我们的框架的架构图吗?上面这张是我们今天的架构图,除了Struts,Spring层,我们需要变换的是DAO层即把原来的SQL这部分换成iBatis,我们在次使用的是iBatis版本3。

由于我们在第十八天中已经说了这样的一个框架的好处其中就有:

层中相关技术的替换不影响到其它层面

所以对于我们来说我们需要改动的代码只有datasource.xmldao层的2个接口两个类,那我们就一起来看看这个基于全注解的SSi框架是怎么样搭起来的吧。

三、搭建SSI框架

3.1建立工程

我们还是使用maven来建立我们的工程


建完后照着翻外篇《第十九天》中的“四、如何让Maven构建的工程在eclipse里跑起来”对工程进行设置。




3.2 增加iBatis3的jar相关包

打开pom.xml

第一步

找到“slf4j”,将它在pom中的描述改成如下内容:

<dependency>

                        <groupId>org.slf4j</groupId>

                        <artifactId>slf4j-api</artifactId>

                        <version>1.5.10</version>

</dependency>

第二步

增加两个jar包

<dependency>

                        <groupId>org.slf4j</groupId>

                        <artifactId>slf4j-log4j12</artifactId>

                        <version>1.5.10</version>

</dependency>

<dependency>

                        <groupId>org.apache.ibatis</groupId>

                        <artifactId>ibatis-core</artifactId>

                        <version>3.0</version>

</dependency>

3.3 开始配置ibatis与spring结合

打开/src/main/resources/spring/datasource下的datasource.xml,增加如下几行

<bean id="iBatisSessionFactory" class="org.sky.ssi.ibatis.IBatis3SQLSessionFactoryBean" scope="singleton">

                                                <property name="configLocation" value="sqlmap.xml"></property>

                                                <property name="dataSource" ref="dataSource"></property>

</bean>

<bean id="iBatisDAOSupport" class="org.sky.ssi.ibatis.IBatisDAOSupport">

</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

                        <property name="dataSource" ref="dataSource" />

</bean>

此处,我们需要4个类,它们是:

org.sky.ssi.ibatis.IBatis3SQLSessionFactoryBean

package org.sky.ssi.ibatis;

 

import java.io.IOException;

import java.io.Reader;

import javax.sql.DataSource;

import org.apache.ibatis.builder.xml.XMLConfigBuilder;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.mapping.Environment;

import org.apache.ibatis.session.Configuration;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;

import org.springframework.beans.factory.FactoryBean;

import org.springframework.beans.factory.InitializingBean;

import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;

 

/**

 *

 * IBatis3SQLSessionFactoryBean is responsible for integrating iBatis 3 <p>

 * with spring 3. Since all environment configurations have been moved to <p>

 * spring, this class takes the responsibility to get environment information<p>

 *  from spring configuration to generate SqlSessionFactory.

 * @author lifetragedy

 *

 */

public class IBatis3SQLSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean{

                        private String configLocation;   

    private DataSource dataSource;   

    private SqlSessionFactory sqlSessionFactory;   

    private boolean useTransactionAwareDataSource = true;   

    private String environmentId = "development";

                        public String getConfigLocation() {

                                                return configLocation;

                        }

                        public void setConfigLocation(String configLocation) {

                                                this.configLocation = configLocation;

                        }

                        public DataSource getDataSource() {

                                                return dataSource;

                        }

                        public void setDataSource(DataSource dataSource) {

                                                this.dataSource = dataSource;

                        }

                        public SqlSessionFactory getSqlSessionFactory() {

                                                return sqlSessionFactory;

                        }

                        public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {

                                                this.sqlSessionFactory = sqlSessionFactory;

                        }

                        public boolean isUseTransactionAwareDataSource() {

                                                return useTransactionAwareDataSource;

                        }

                        public void setUseTransactionAwareDataSource(

                                                                        boolean useTransactionAwareDataSource) {

                                                this.useTransactionAwareDataSource = useTransactionAwareDataSource;

                        }

                        public String getEnvironmentId() {

                                                return environmentId;

                        }

                        public void setEnvironmentId(String environmentId) {

                                                this.environmentId = environmentId;

                        }

                       

                        public SqlSessionFactory getObject() throws Exception {   

        return this.sqlSessionFactory;   

    }   

  

    public Class<SqlSessionFactory> getObjectType() {   

        return  SqlSessionFactory.class;   

    }

   

    public boolean isSingleton() {   

        return true;   

    }   

  

    public void afterPropertiesSet() throws Exception {   

        this.sqlSessionFactory = this.buildSqlSessionFactory(configLocation);   

    }

   

    protected SqlSessionFactory buildSqlSessionFactory(String configLocation)   

    throws IOException {   

                        if (configLocation == null) {   

                                                throw new IllegalArgumentException(   

                                                "configLocation entry is required");   

                        }   

                        DataSource dataSourceToUse = this.dataSource;   

                        if (this.useTransactionAwareDataSource   

                                                                        && !(this.dataSource instanceof TransactionAwareDataSourceProxy)) {   

                                                dataSourceToUse = new TransactionAwareDataSourceProxy(   

                                                                                                this.dataSource);   

                        }   

 

                        Environment environment = new Environment(environmentId,   

                                                                        new IBatisTransactionFactory(dataSourceToUse), dataSourceToUse);   

 

                        Reader reader = Resources.getResourceAsReader(configLocation);   

                        XMLConfigBuilder parser = new XMLConfigBuilder(reader, null, null);   

                        Configuration config = parser.parse();   

                        config.setEnvironment(environment);   

 

                        return new DefaultSqlSessionFactory(config);   

    }

 

}

org.sky.ssi.ibatis.IBatisDAOSupport

package org.sky.ssi.ibatis;

 

import javax.annotation.Resource;

 

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.log4j.Logger;

 

 

/**

 * Base class for all DAO class. The subclass extends this class to get

 * <p>

 * DAO implementation proxy.

 *

 * @author lifetragedy

 *

 * @param <T>

 */

public class IBatisDAOSupport<T> {

 

                        protected Logger log = Logger.getLogger(this.getClass());

 

                        @Resource

                        private SqlSessionFactory ibatisSessionFactory;

 

                        private T mapper;

 

                        public SqlSessionFactory getSessionFactory() {

                                                return ibatisSessionFactory;

                        }

 

                        protected SqlSession getSqlSession() {

                                                return ibatisSessionFactory.openSession();

                        }

 

                        public T getMapper(Class<T> clazz) {

                                                mapper = getSqlSession().getMapper(clazz);

                                                return mapper;

                        }

 

                        public T getMapper(Class<T> clazz, SqlSession session) {

                                                mapper = session.getMapper(clazz);

                                                return mapper;

                        }

 

                        /**

                         * close SqlSession

                         */

                        protected void closeSqlSession(SqlSession sqlSession) throws Exception {

                                                try {

                                                                        if (sqlSession != null) {

                                                                                                sqlSession.close();

                                                                                                sqlSession = null;

                                                                        }

                                                } catch (Exception e) {

                                                }

                        }

}

org.sky.ssi.ibatis.IBatisTransaction

package org.sky.ssi.ibatis;

import java.sql.Connection;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.ibatis.transaction.Transaction;

import org.springframework.jdbc.datasource.DataSourceUtils;

public class IBatisTransaction implements Transaction{

                        private DataSource dataSource;

                        private Connection connection;

                        public IBatisTransaction(DataSource dataSource, Connection con, boolean autoCommit){

                                                this.dataSource = dataSource;

                                                this.connection = con;

                        }

 

                        public Connection getConnection(){

                                                return connection;

                        }

 

    public void commit()

        throws SQLException{                        }

 

    public void rollback()

        throws SQLException{                        }

 

    public void close()

        throws SQLException{

                        if(dataSource != null && connection != null){

                                                DataSourceUtils.releaseConnection(connection, dataSource);

                        }

    }

}

org.sky.ssi.ibatis.IBatisTransactionFactory

package org.sky.ssi.ibatis;

 

import java.sql.Connection;

import java.util.Properties;

 

import javax.sql.DataSource;

 

import org.apache.ibatis.transaction.Transaction;

import org.apache.ibatis.transaction.TransactionFactory;

 

public class IBatisTransactionFactory implements TransactionFactory{

                       

                         private DataSource dataSource;

                       

                         public IBatisTransactionFactory(DataSource dataSource){

                                                 this.dataSource = dataSource;

                         }

                         

                         public void setProperties(Properties properties){      }

                         

                         public Transaction newTransaction(Connection connection, boolean flag){

                                                 return new IBatisTransaction(dataSource,connection,flag);

                         }

 

}

此三个类的作用就是在datasource.xml文件中描述的,把spring与datasource.xml中的datasource和transaction连接起来,此处尤其是“IBatis3SQLSessionFactoryBean”的写法,它通过spring中的“注入”特性,把iBatis的配置注入进spring并委托spring的context来管理iBatis(此属网上没有的资料,全部为本人在历年工程中的经验总结,并且已经在至少3个项目中进行了集成使用与相关测试)。

建立iBatis配置文件

我们先在/src/main/resources目录下建立一个叫sqlmap.xml的文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

<configuration>

                        <mappers>

                                                <mapper resource="ibatis/index.xml" />

                                                <mapper resource="ibatis/login.xml" />

                        </mappers>

</configuration>

然后我们在/src/main/resources 目录下建立index.xml与login.xml这2个xml文件。


看到这儿,有人会问了:为什么不把这两个xml文件也建立在spring目录下?

原因很简单:

在datasource.xml文件内我们已经通过

<bean id="iBatisSessionFactory" class="org.sky.ssi.ibatis.IBatis3SQLSessionFactoryBean" scope="singleton">

                                <property name="configLocation" value="sqlmap.xml"></property>

                                <property name="dataSource" ref="dataSource"></property>

</bean>

这样的方式把iBatis委托给了spring,iBatis的核心就是这个sqlmap.xml文件了,而在这个sqlmap.xml文件已经引用了login.xml与index.xml文件了。

而我们的web.xml文件里有这么一句:

<context-param>

                                <param-name>contextConfigLocation</param-name>

                                <param-value>/WEB-INF/classes/spring/**/*.xml</param-value>

</context-param>

因此如果我们再把ibatis/index.xml与ibatis/login.xml再建立到src/main/resources/spring目录下,spring于是会在容器启动时试图加载这两个xml文件,然后一看这两个xml文件不是什么spring的bean,直接抛错,对吧?

其们等一会再来看login.xml文件与index.xml文件,我们先来搞懂iBatis调用原理.

3.4 iBatis调用原理

1)iBatis就是一个dao层,它又被称为sqlmapping,它的sql是书写在一个.xml文件内的,在该xml文件内会将相关的sql绑定到相关的dao类的方法。

2)在调用结束时我们需要在finally块中关闭相关的sql调用。

我们来看一个例子。

login.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper

PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"

"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<mapper namespace="org.sky.ssi.dao.LoginDAO">

                        <select id="validLogin" resultType="int" parameterType="java.util.Map">

                                                <![CDATA[

                                                SELECT count(1) from t_login where login_id= #{loginId} and login_pwd=#{loginPwd}

                                                ]]>

                        </select>

</mapper>

该DAO指向了一个接口org.sky.ssi.dao.LoginDAO,该dao接受一个sql,并且接受一个Map类型的参数。

那么我们来看该DAO

LoginDao.java

package org.sky.ssi.dao;

 

import java.util.Map;

 

public interface LoginDAO {

                public int validLogin(Map<String, Object> paraMap) throws Exception;

}

 

LoginImpl.java

package org.sky.ssi.dao.impl;

 

import java.util.Map;

 

import org.apache.ibatis.session.SqlSession;

import org.sky.ssi.dao.LoginDAO;

import org.sky.ssi.ibatis.IBatisDAOSupport;

import org.springframework.stereotype.Repository;

 

@Repository

public class LoginDAOImpl extends IBatisDAOSupport<LoginDAO> implements LoginDAO {

 

                public int validLogin(Map<String, Object> paraMap) throws Exception {

                                SqlSession session = this.getSqlSession();

                                try {

                                                return this.getMapper(LoginDAO.class, session).validLogin(paraMap);

                                } catch (Exception e) {

                                                log.error(e.getMessage(), e);

                                                throw new Exception(e);

                                } finally {

                                                this.closeSqlSession(session);

                                }

                }

 

}

很简单吧,一切逻辑都在xml文件内。

一定记得不要忘了在finally块中关闭相关的sql调用啊,要不然将来工程出了OOM的错误不要怪我啊.

3.5 index模块

Index.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper

PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"

"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<mapper namespace="org.sky.ssi.dao.StudentDAO">

                        <select id="getAllStudent" resultType="org.sky.ssi.dbo.StudentDBO">

                                                <![CDATA[

                                                SELECT student_no studentNo, student_name studentName from t_student

                                                ]]>

                        </select>

 

                        <update id="addStudent" parameterType="java.util.Map">

                                                insert into t_student(student_no, student_name)values(seq_student_no.nextval,#{stdName})

                        </update>

 

                        <update id="delStudent" parameterType="java.util.Map">

                                                delete from t_student where student_no=#{stdNo}

                        </update>

</mapper>

它指向了StudentDAO这个接口

StudentDAO.java

package org.sky.ssi.dao;

 

import org.sky.ssi.dbo.StudentDBO;

import org.sky.ssi.student.form.*;

import java.util.*;

 

public interface StudentDAO {

 

                        public List<StudentDBO> getAllStudent() throws Exception;

 

                        public void addStudent(Map<String, Object> paraMap) throws Exception;

 

                        public void delStudent(Map<String, Object> paraMap) throws Exception;

}

StudentDAOImpl.java

package org.sky.ssi.dao.impl;

 

import java.util.List;

import java.util.Map;

 

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.ibatis.session.SqlSession;

import org.sky.ssi.dao.StudentDAO;

import org.sky.ssi.ibatis.IBatisDAOSupport;

import org.sky.ssi.dbo.StudentDBO;

 

import org.springframework.stereotype.Repository;

 

@Repository

public class StudentDAOImpl extends IBatisDAOSupport<StudentDAO> implements StudentDAO {

 

                        @Override

                        public List<StudentDBO> getAllStudent() throws Exception {

                                                SqlSession session = this.getSqlSession();

                                                try {

                                                                        return this.getMapper(StudentDAO.class, session).getAllStudent();

                                                } catch (Exception e) {

                                                                        throw new Exception(e);

                                                } finally {

                                                                        this.closeSqlSession(session);

                                                }

                        }

 

                        public void addStudent(Map<String, Object> paraMap) throws Exception {

                                                SqlSession session = this.getSqlSession();

                                                try {

                                                                        this.getMapper(StudentDAO.class, session).addStudent(paraMap);

                                                } catch (Exception e) {

                                                                        throw new Exception(e);

                                                } finally {

                                                                        this.closeSqlSession(session);

                                                }

                        }

 

                        public void delStudent(Map<String, Object> paraMap) throws Exception {

                                                SqlSession session = this.getSqlSession();

                                                try {

                                                                        this.getMapper(StudentDAO.class, session).delStudent(paraMap);

                                                } catch (Exception e) {

                                                                        throw new Exception(e);

                                                } finally {

                                                                        this.closeSqlSession(session);

                                                }

                        }

}

3.6 Service接口微微有些改变

为了演示给大家看 iBatis接受多个参数的例子因此我们把原来的如:login(String loginId, String loginPwd)这样的方法改成了public int validLogin(Map<String, Object> paraMap) throws Exception;这样的结构,请大家注意。

四、beta工程中的增加功能

4.1 增加了一个filter

在我们的web.xml文件中

<filter>

                        <filter-name>LoginFilter</filter-name>

                        <filter-class>org.sky.ssi.filter.LoginFilter</filter-class>

                        <init-param>

                                                <param-name>exclude</param-name>

                                                <param-value>/jsp/login/login.jsp,

                                                             /login.do

                                                </param-value>

                        </init-param>

</filter>

<filter-mapping>

                        <filter-name>LoginFilter</filter-name>

                        <url-pattern>*.jsp</url-pattern>

</filter-mapping>

<filter-mapping>

                        <filter-name>LoginFilter</filter-name>

                        <url-pattern>/servlet/*</url-pattern>

</filter-mapping>

<filter-mapping>

                        <filter-name>LoginFilter</filter-name>

                        <url-pattern>*.do</url-pattern>

</filter-mapping>

有了这个filter我们就不用在我们的web工程中每一个action、每 个jsp里进行“用户是否登录”的判断了,它会自动根据配置除去“exclude”中的相关web resource,全部走这个“是否登录”的判断。

注意此处这个exclude是笔者自己写的,为什么要exclude?

如果你不exclude,试想一个用户在login.jsp中填入相关的登录信息后点一下login按钮跳转到了login.do,而这两个web resource由于没有被“排除”出“需要登录校验”,因此每次你一调用login.jsp, login.do这个filter就都会强制要求你再跳转到login.jsp,那么我们一个用户从login.jsp登录完后再跳回login.jsp再跳回,再跳回,如此重复,进入死循环。

4.2 增加了一个自动记录异常的日志功能

在我们的applicationContext.xml文件中

    <bean

        id="methodLoggerAdvisor"

        class="org.sky.ssi.util.LoggerAdvice" >

    </bean>

    <aop:config>

        <aop:aspect

            id="originalBeanAspect"

            ref="methodLoggerAdvisor" >

            <aop:pointcut

                id="loggerPointCut"

                expression="execution(* org.sky.ssi.service.impl.*.*(..))" />

            <aop:around

                method="aroundAdvice"

                pointcut-ref="loggerPointCut" />

        </aop:aspect>

    </aop:config>

这样,我们的dao层、service层、有错就只管往外throw,框架一方面在接到相关的exception会进行数据库事务的自动回滚外,还会自动把service层抛出的exception记录在log文件中。

五、测试我们的工程

确认我们的StudentServiceImpl中删除学生的delStudent方法内容如下:

public void delStudent(String[] stdNo) throws Exception {

              for (String s : stdNo) {

                     Map<String, Object> paraMap = new HashMap<String, Object>();

                     paraMap.put("stdNo", s);

                     studentDAO.delStudent(paraMap);

                     throw new Exception("force system to throw a exception");

              }

}

 

我们把beta工程添加入我们在eclipse中配好的j2eeserver中去并启动起来。


在IE中输入:http://localhost:8080/beta/index.do。 系统直接跳到login界面


我们输入相关的用户名写密码。


我们选中“13号学生高乐高”与“9号学生”,点“deletestudent”按钮。



后台抛错了,查看数据库内的数据


数据还在,说明我们的iBatis的事务已经在spring中启作用了.

再次更改StudentServiceImpl.java类中的delStudent方法,把“throw new Exception("force system to throw a exception");”注释掉,再来运行



我们再次选 中9号和13号学生,点deletestudent按钮,删除成功,这个够13的人终于被删了,呵呵。



目录
相关文章
|
1天前
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
16 5
|
7天前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
9天前
|
监控 安全 Cloud Native
企业网络架构安全持续增强框架
企业网络架构安全评估与防护体系构建需采用分层防御、动态适应、主动治理的方法。通过系统化的实施框架,涵盖分层安全架构(核心、基础、边界、终端、治理层)和动态安全能力集成(持续监控、自动化响应、自适应防护)。关键步骤包括系统性风险评估、零信任网络重构、纵深防御技术选型及云原生安全集成。最终形成韧性安全架构,实现从被动防御到主动免疫的转变,确保安全投入与业务创新的平衡。
|
15天前
|
存储 人工智能 开发框架
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
|
15天前
|
人工智能 自然语言处理 并行计算
MeteoRA:多任务AI框架革新!动态切换+MoE架构,推理效率提升200%
MeteoRA 是南京大学推出的多任务嵌入框架,基于 LoRA 和 MoE 架构,支持动态任务切换与高效推理。
52 3
|
24天前
|
前端开发 Java 数据库连接
Spring框架初识
Spring 是一个分层的轻量级开源框架,核心功能包括控制反转(IOC)和面向切面编程(AOP)。主要模块有核心容器、Spring 上下文、AOP、DAO、ORM、Web 模块和 MVC 框架。它通过 IOC 将配置与代码分离,简化开发;AOP 提供了声明性事务管理等增强功能。
74 21
Spring框架初识
|
1月前
|
XML Java 开发者
通过springboot框架创建对象(一)
在Spring Boot中,对象创建依赖于Spring框架的核心特性——控制反转(IoC)和依赖注入(DI)。IoC将对象的创建和管理交由Spring应用上下文负责,开发者只需定义依赖关系。DI通过构造函数、setter方法或字段注入实现依赖对象的传递。Spring Boot的自动配置机制基于类路径和配置文件,自动为应用程序配置Spring容器,简化开发过程。Bean的生命周期包括定义扫描、实例化、依赖注入、初始化和销毁回调,均由Spring容器管理。这些特性提高了开发效率并简化了代码维护。
|
1月前
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
|
3月前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
82 0
|
3月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
357 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型

热门文章

最新文章

推荐镜像

更多