溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringBoot微服務(wù)改造過(guò)程是怎樣

發(fā)布時(shí)間:2021-09-29 17:26:53 來(lái)源:億速云 閱讀:142 作者:柒染 欄目:大數(shù)據(jù)

SpringBoot微服務(wù)改造過(guò)程是怎樣,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

SSO是公司一個(gè)已經(jīng)存在了若干年的項(xiàng)目,后端采用SpringMVC、MyBatis,數(shù)據(jù)庫(kù)使用MySQL,前端展示使用Freemark。今年,我們對(duì)該項(xiàng)目進(jìn)行了一次革命性的改進(jìn),改造成SpringBoot架構(gòu),并且把前后端分離,前端采用Vue框架。

一、使用SpringBoot架構(gòu)進(jìn)行改造

1.1 為什么使用SpringBoot

相比較于傳統(tǒng)的Spring,SpringBoot具有以下優(yōu)點(diǎn):

  • 部署簡(jiǎn)單,SpringBoot內(nèi)置了Tomcat容器,可以將程序直接編譯成一個(gè)jar,通過(guò)java-jar來(lái)運(yùn)行。

  • 編碼簡(jiǎn)單,SpringBoot只需要在pom文件中添加一個(gè)starter-web依賴,即可幫助開發(fā)者快速啟動(dòng)一個(gè)web容器,非常方便。

  • 配置簡(jiǎn)單,SpringBoot可以通過(guò)簡(jiǎn)單的注解方式來(lái)代替原先Spring非常復(fù)雜的xml方式。如果我想把一個(gè)普通的類交給Spring管理,只需要添加@Configuration和@Bean兩個(gè)注解即可。

  • 監(jiān)控簡(jiǎn)單,我們可以引入spring-boot-start-actuator依賴,直接使用REST方式來(lái)獲取進(jìn)程的運(yùn)行期性能參數(shù),從而達(dá)到監(jiān)控的目的。

1.2 一個(gè)常規(guī)項(xiàng)目都需要改造哪些部分

1.2.1 配置文件

SSO項(xiàng)目改造前充斥著大量的配置文件,主要包含以下這些部分:

  • 靜態(tài)資源相關(guān)

  • 數(shù)據(jù)源

  • mybatis配置

  • redis配置

  • 事務(wù)

  • 攔截器攔截內(nèi)容

  • 監(jiān)聽器、過(guò)濾器

  • 組件掃描路徑配置

本文著重介紹以下幾個(gè)部分:

1)靜態(tài)資源處理

SpringMVC中,如果mvc:interceptors配置的URL規(guī)則如下,則不會(huì)攔截靜態(tài)資源。

<mvc:mapping path="/*.do" />

但是如果配置的是:

<mvc:mapping path="/**" />

方案1: 在web.xml中配置<servlet-name>default</servlet-name>,用defaultServlet先處理請(qǐng)求如:

   <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.png</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.gif</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.ico</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.gif</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>

方案2:使用<mvc:resources />標(biāo)簽聲明靜態(tài)資源路徑

<mvc:resources mapping="/resources/js/**" location="/js/" /> 
<mvc:resources mapping="/resources/images/**" location="/images/" /> 
<mvc:resources mapping="/resources/css/**" location="/css/" />

方案3:使用mvc:default-servlet-handler/標(biāo)簽

SpringBoot解決方案:繼承WebMvcConfigurerAdapter實(shí)現(xiàn)addResourceHandlers方法。

public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**")
    .addResourceLocations("classpath:/resource/")//sso靜態(tài)資源
    .addResourceLocations("classpath:/META-INF/resources/")//swagger靜態(tài)資源
    .setCachePeriod(0);//0表示不緩存 
}

sso靜態(tài)資源文件路徑如圖:

SpringBoot微服務(wù)改造過(guò)程是怎樣

2)攔截器

SpringMVC配置文件內(nèi)容:

攔截任何請(qǐng)求并且初始化參數(shù),有些請(qǐng)求是不需要攔截的,有的請(qǐng)求登錄后不需要經(jīng)過(guò)權(quán)限校驗(yàn)直接放行。

<mvc:interceptors>  
	<mvc:interceptor>  
		<mvc:mapping path="/**" />  
           <bean class="自定義攔截器PermissionInterceptor">  
		   <!-- 未登錄即可訪問(wèn)的地址 -->  
		  <property name="excludeUrls">
		  <list><value>請(qǐng)求地址<value></list>
		  </property>
		  <!-- 只要登錄了就不需要攔截的資源 -->
		  <property name="LogInExcludeUrls">
		  <list><value>請(qǐng)求地址<value></list>
		  </property>
		 </bean>
   </mvc:interceptor> 
 </mvc:interceptors>

SpringBoot中添加攔截器只需繼承WebMvcConfigurerAdapter,并重寫addInterceptors方法即可。

 /*** 攔截器 
 * @param registry
 */ 
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(permissionInterceptor).
            addPathPatterns("/**");
 	super.addInterceptors(registry);
 }

自定義的攔截器需要初始化一些參數(shù),因此需要在注冊(cè)攔截器之前注冊(cè),這里我們?cè)O(shè)置為懶加載。免登錄攔截的路徑,以及登錄后不需要判斷權(quán)限的路徑都寫在yml文件了,通過(guò)系統(tǒng)環(huán)境變量Environment獲取值。

@Autowired
@Lazy 
private PermissionInterceptor permissionInterceptor;  
@Autowired 
private Environment environment;

/**
*
*/
@Bean 
public PermissionInterceptor permissionInterceptor() {
  PermissionInterceptor permissionInterceptor = new PermissionInterceptor();
  List<String> excludeUrls = Arrays.asList(environment.getProperty("intercept.exclude.path").split(","));
  List<String> commonUrls = Arrays.asList(environment.getProperty("intercept.login.exclude.path").split(","));
  permissionInterceptor.setCommonUrls(commonUrls);
  permissionInterceptor.setExcludeUrls(excludeUrls);
 return permissionInterceptor; 
}
3)數(shù)據(jù)庫(kù)和mybatis配置

A、數(shù)據(jù)源配置

數(shù)據(jù)源注入的三種情況:

【情況一】

  • 條件:不引?druid-spring-boot-starter只依賴druid.jar,不指定spring.datasource.type。

  • 結(jié)果:注入的數(shù)據(jù)源是tomcat的數(shù)據(jù)源。

  • 解析:依賴的mybatis-spring-boot-starter工程依賴了tomcat的數(shù)據(jù)源,spring-boot-autoconfigure-starter的DataSourceAutoConfiguration自動(dòng)注入類會(huì)在不指定數(shù)據(jù)源的情況下,判斷路徑中是否存在默認(rèn)的4種數(shù)據(jù)源(Hikari,Tomcat,Dbcp,Dbcp2)的其一,如果有就注入。

【情況二】

  • 條件:不引入druid-spring-boot-starter只依賴druid.jar ,指定spring.datasource.type為DruidDataSource。

  • 結(jié)果:注入了DruidDataSource數(shù)據(jù)源,但配置文件中的druid配置不會(huì)生效。

  • 解析: 指定了依賴的數(shù)據(jù)源后,spring自動(dòng)注入的starter會(huì)將指定的數(shù)據(jù)源注入,yml指定了druid數(shù)據(jù)源。@ConfigurationProperties注解的DataSourceProperties沒(méi)處理druid部分的性能參數(shù)屬性,只處理了數(shù)據(jù)源部分的屬性。

【情況三】

  • 條件:引??druid-spring-boot-starter?不依賴druid.jar,指定spring.datasource.type為DruidDataSource。

  • 結(jié)果:注入了DruidDataSource數(shù)據(jù)源, 配置文件中的druid配置也會(huì)生效。

  • 解析:druid-spring-boot-starter自動(dòng)配置類會(huì)在DataSourceAutoConfiguration之前先創(chuàng)建數(shù)據(jù)源,并且@ConfigurationProperties注入的DataSourceProperties包含了配置文件中druid的屬性。

pom.xml依賴:

	<!-- 情況一、二 測(cè)試引入的依賴 -->
	<!--<dependency>-->
		<!--<groupId>com.alibaba</groupId>-->
		<!--<artifactId>druid</artifactId>-->
		<!--<version>${druid.version}</version>-->
	<!--</dependency>-->
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid-spring-boot-starter</artifactId>
		<version>1.1.10</version>
	</dependency>
	<dependency>
		<groupId>org.mybatis.spring.boot</groupId>
		<artifactId>mybatis-spring-boot-starter</artifactId>
		<version>RELEASE</version>
	</dependency>	

yml配置:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 當(dāng)前數(shù)據(jù)源操作類型
    driver-class-name: com.mysql.jdbc.Driver            # mysql驅(qū)動(dòng)包
    url: jdbc:mysql://yourURL        # 數(shù)據(jù)庫(kù)名稱
    username: yourusername
    password: yourpassword
    druid:
      initial-size: 5  # 初始化大小
      min-idle: 5  # 最小
      max-active: 20  # 最大
      max-wait: 60000  # 連接超時(shí)時(shí)間
      time-between-eviction-runs-millis: 60000  # 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒
      min-evictable-idle-time-millis: 300000  # 指定一個(gè)空閑連接最少空閑多久后可被清除,單位是毫秒
      validationQuery: select 'x'
      test-while-idle: true  # 當(dāng)連接空閑時(shí),是否執(zhí)行連接測(cè)試
      test-on-borrow: false  # 當(dāng)從連接池借用連接時(shí),是否測(cè)試該連接
      test-on-return: false  # 在連接歸還到連接池時(shí)是否測(cè)試該連接
      filters: config,wall,stat

B、MyBatis配置

通過(guò)引入mybatis-spring-boot-starter依賴,可以簡(jiǎn)單配置mybatis上手使用。

下面簡(jiǎn)單分析mybatis-starter的源碼以及如何配置mybatis。

先看mybatis-spring-boot-starter中mybatis-spring-boot-autoconfigure的spring.factories文件

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

可以看到自動(dòng)注入類是MybatisAutoConfiguration,我們從這個(gè)類入手分析可以知道,必須先創(chuàng)建好了數(shù)據(jù)源后,才會(huì)加載mybatis的sqlSessionFactory。

@EnableConfigurationProperties({MybatisProperties.class})注解指定了配置文件中 prefix = "mybatis" 那部分屬性有效,這部分屬性值將注入到已創(chuàng)建的SqlSessionFactoryBean中,最后生成SqlSessionFactory對(duì)象。

@Configuration
//當(dāng)SqlSessionFactory,SqlSessionFactoryBean存在的情況下加載當(dāng)前Bean
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
//當(dāng)指定數(shù)據(jù)源在容器中只有一個(gè)或者有多個(gè)但是只指定首選數(shù)據(jù)源
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisProperties.class})
//當(dāng)數(shù)據(jù)源注入到Spring容器后才開始加載當(dāng)前Bean
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisAutoConfiguration implements InitializingBean {
	private final MybatisProperties properties;
	@Bean
	@ConditionalOnMissingBean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); 		 
		factory.setDataSource(dataSource);
		factory.setVfs(SpringBootVFS.class);
	   //設(shè)置mybatis配置文件所在路徑
        if (StringUtils.hasText(this.properties.getConfigLocation())) {
	      factory.setConfigLocation(this.resourceLoader.getResource
          (this.properties.getConfigLocation())); }
	    }
	  //設(shè)置其他MyBatisProperties對(duì)象中有的屬性略....
       return factory.getObject();
   }
}

MybatisProperties含有的屬性:

@ConfigurationProperties(prefix = "mybatis" )
public class MybatisProperties {
 public static final String MYBATIS_PREFIX = "mybatis";
 private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
 private String configLocation;
 private String[] mapperLocations;
 private String typeAliasesPackage;
 private Class<?> typeAliasesSuperType;
 private String typeHandlersPackage;
 private boolean checkConfigLocation = false;
 private ExecutorType executorType;
 private Properties configurationProperties;
 @NestedConfigurationProperty
 private Configuration configuration;
}

C、使用mybatis

  • 配置文件:

application.yml

mybatis:
config-location: classpath:mybatis.xml        # mybatis配置文件所在路徑
type-aliases-package: com.creditease.permission.model    # 所有Entity別名類所在包
mapper-locations: classpath:mybatis/**/*.xml

從上面的MybatisProperties可以看出,mybatis可以指定一些configuration,比如自定義攔截器pageHelper。

mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
		<plugin interceptor="com.creditease.permission.manager.MybatisInterceptor"></plugin>
	</plugins>
</configuration>
  • 在啟動(dòng)類上加入@MapperScan注解

@MapperScan("com.creditease.permission.dao")//mapper類所在目錄
public class SsoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SsoApplication.class, args);
    }
}
4)事務(wù)

Spring事務(wù)有兩種處理方式:

  • 編程式

用TransactionTemplate或者直接使用底層的PlatformTransactionManager將事務(wù)代碼寫在業(yè)務(wù)代碼中。

優(yōu)點(diǎn):可以在代碼塊中處理事務(wù),比較靈活。

缺點(diǎn):對(duì)代碼具有侵入性。

  • 聲明式

采用@Transactional注解或者基于配置文件方式,在方法前后進(jìn)行攔截。

優(yōu)點(diǎn):非侵入性不會(huì)污染代碼。

缺點(diǎn):事務(wù)只能在方法和類上控制,粒度較小。

A、使用@Transactional注解

非SpringBoot工程,需要在配置文件中加入配置:

 <tx:annotation-driven/>

SpringBoot工程可以用@EnableTransactionManagement注解代替上面的配置內(nèi)容。

B、采用配置文件方式

之前的sso是基于配置的方式,配置代碼如下:

<aop:config>
     <aop:pointcut expression="execution(public * com.creditease.permission.service.impl.*Impl.*(..))" id="pointcut"/>
     <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
 </aop:config>
 <tx:advice id="txAdvice" transaction-manager="transactionManager">
     <tx:attributes>
         <tx:method name="query*" propagation="REQUIRED" read-only="true"/>
         <tx:method name="find*" propagation="REQUIRED" read-only="true"/>
         <tx:method name="save*" propagation="REQUIRED"/>
         <tx:method name="delete*" propagation="REQUIRED"/>
         <tx:method name="add*" propagation="REQUIRED"/>
         <tx:method name="modify*" propagation="REQUIRED"/>
     </tx:attributes>
 </tx:advice>

改造后的SpringBoot基于Java代碼:

@Aspect
@Configuration
public class TransactionAdviceConfig {

 /**
  * 指定切入點(diǎn)
  */
 private static final String AOP_POINTCUT_EXPRESSION = "execution(public * com.creditease.permission.service.impl.*Impl.*(..))";

 @Resource
 DruidDataSource dataSource;

 /**
  * 指定處理事務(wù)的PlatformTransactionManager
  * @return
  */
 @Bean
 public DataSourceTransactionManager transactionManager() {

     return new DataSourceTransactionManager(dataSource);

 }

 /**
  * 指定切入點(diǎn)處理邏輯,執(zhí)行事務(wù)
  * @return
  */
 @Bean
 public TransactionInterceptor txAdvice() {

     DefaultTransactionAttribute txAttrRequired = new DefaultTransactionAttribute();
     txAttrRequired.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

     DefaultTransactionAttribute txAttrRequiredReadonly = new DefaultTransactionAttribute();
     txAttrRequiredReadonly.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
     txAttrRequiredReadonly.setReadOnly(true);

     NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
     source.addTransactionalMethod("query*", txAttrRequiredReadonly);
     source.addTransactionalMethod("find*", txAttrRequiredReadonly);
     source.addTransactionalMethod("save*", txAttrRequired);
     source.addTransactionalMethod("delete*", txAttrRequired);
     source.addTransactionalMethod("add*", txAttrRequired);
     source.addTransactionalMethod("modify*", txAttrRequired);
     return new TransactionInterceptor(transactionManager(), source);
 }

 /**
  * Advisor組裝配置,將Advice的代碼邏輯注入到Pointcut位置
  * @return
  */
 @Bean
 public Advisor txAdviceAdvisor() {
     
     AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
     pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
     return new DefaultPointcutAdvisor(pointcut, txAdvice());
 }
5)全局異常處理

一般編碼時(shí)有異常我們都會(huì)try-catch捕獲異常,有時(shí)為了區(qū)分不同的異常還會(huì)一次catch多個(gè)異常,大量的try-catch語(yǔ)句,這樣使得代碼也不夠優(yōu)雅;一個(gè)相同的異常處理寫多次代碼也比較冗余,所以引入全局的異常處理非常必要。

改造前的異常處理配置文件:

<!--定義異常處理頁(yè)面-->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="com.creditease.permissionapi.exception.NopermissionException">/permission/noSecurity</prop>
            </props>
        </property>
 </bean>

使用SimpleMappingExceptionResolver類處理異常,設(shè)置自定義異常類型NopermissionException,以及異常發(fā)生后的請(qǐng)求路徑/permission/noSecurity。

SpringBoot中采用@RestControllerAdvice或者@ControllerAdvice設(shè)置全局異常類。這兩者區(qū)別類似于@Controller和@RestController注解。

SSO中定義了三種全局的異常處理:普通的Exception處理;自定的NopermissionException異常和參數(shù)校驗(yàn)異常。

全局異常處理代碼如下:

@Configuration
@Slf4j
@RestControllerAdvice
public class GlobalExceptionConfig {

	//無(wú)權(quán)限處理
    @ExceptionHandler(value = {NopermissionException.class})
    public void noPermissionExceptionHandler(HttpServletRequest request, Exception ex, HttpServletResponse response, @Value("${sso.server.prefix}") String domain) throws  IOException {
        printLog(request,ex);
        response.sendRedirect("跳轉(zhuǎn)到無(wú)權(quán)限頁(yè)面地址");
    }
    
   	 //參數(shù)校驗(yàn)處理
	@ExceptionHandler(value = {BindException.class})
    public ResultBody BindExceptionHandler(BindException  bindException){
        List<ObjectError> errors = bindException.getBindingResult().getAllErrors();
        //這個(gè)ResultBody是一個(gè)返回結(jié)果對(duì)象,這里需要返回json,里面包含了狀態(tài)碼和提示信息
        return  ResultBody.buildFailureResult(errors.get(0).getDefaultMessage());
    }

	//所有未捕獲的異常處理邏輯
    @ExceptionHandler(value = {Exception.class})
    public ResultBody exceptionHandler(HttpServletRequest request,Exception ex){
        printLog(request,ex);
        return  ResultBody.buildExceptionResult();
    }

	//將請(qǐng)求參數(shù)和異常打印出來(lái),結(jié)合@slf4j注解
    public void printLog(HttpServletRequest request,Exception ex){
        String parameters = JsonHelper.toString(request.getParameterMap());
        log.error("url>>>:{},params>>>:{} ,printLog>>>:{}",request.getRequestURL(),parameters,ex);
    }

}

@RestControllerAdvice結(jié)合@Validation,可以對(duì)Bean進(jìn)行校驗(yàn),校驗(yàn)不通過(guò)會(huì)拋出BindException異常。通過(guò)注解可以少寫if-else代碼,判斷請(qǐng)求的接口參數(shù)是否為空,提高代碼的美觀性。例如:

	//常規(guī)做法
	if(StringUtils.isEmpty(ssoSystem.getSysCode())
	
	//SSO做法
	//在Controller請(qǐng)求方法上添加@Valid注解
	@RequestMapping(value = "/add", method = RequestMethod.POST)
    public ResultBody add(@Valid @RequestBody SsoSystem ssoSystem) {
    
    }

	//在需要處理的SsoSystem Bean的屬性上加@NotNull注解
	@NotNull(message = "系統(tǒng)編號(hào)不能為空")
	private String sysCode;

當(dāng)sysCode傳入?yún)?shù)為空時(shí),就會(huì)拋出BindException被全局的異常處理類,捕獲處理返回json格式的參數(shù):

{
    "resultCode":2,
    "resultMsg":"系統(tǒng)編號(hào)不能為空",
    "resultData":null
}

1.3 注意事項(xiàng)

1.3.1 內(nèi)置tomcat版本太高引發(fā)的問(wèn)題

SpringBoot1.5默認(rèn)使用內(nèi)嵌tomcat8.5版本,而原來(lái)SpringMVC的SSO部署在tomcat7上。tomcat的升級(jí)對(duì)這次改造影響最明顯的就是cookie。 tomcat8后采用的cookie校驗(yàn)協(xié)議是Rfc6265CookieProcessor。該協(xié)議要求domain的命名必須遵循以下規(guī)則:

  • 必須是1-9、a-z、A-Z、. 、- 這幾個(gè)字符組成。

  • 必須是數(shù)字或字母開頭 (之前是以.creditease.corp 會(huì)報(bào)錯(cuò)tomcat cookie domain validation異常,最后改成了 creditease.corp)。

  • 必須是數(shù)字或字母結(jié)尾。

二、前后端分離

2.1 解決跨域問(wèn)題

由于是兩個(gè)不同的應(yīng)用,必然會(huì)有兩個(gè)不同的端口。不同的端口就會(huì)有跨域問(wèn)題,SSO采用的方式是通過(guò)nginx區(qū)分來(lái)自前后端的請(qǐng)求,反向代理請(qǐng)求對(duì)應(yīng)到不同的服務(wù)去。

  • sso.creditease.com對(duì)應(yīng)的是后端的應(yīng)用服務(wù)。

  • sso.creditease.com/web對(duì)應(yīng)的是前端的靜態(tài)資源應(yīng)用服務(wù)。

2.2 方便聯(lián)調(diào)效率,引入swagger

swagger是后端接口展示的插件,通過(guò)修改攔截器代碼,mock登錄對(duì)象免登錄,直接訪問(wèn)接口進(jìn)行前后端的調(diào)試。在swagger插件上可以看到具體接口請(qǐng)求路徑和參數(shù)、參數(shù)是否必須、返回值、接口統(tǒng)計(jì)信息等。

  • 接口統(tǒng)計(jì)信息 SpringBoot微服務(wù)改造過(guò)程是怎樣

  • 請(qǐng)求參數(shù)和路徑

SpringBoot微服務(wù)改造過(guò)程是怎樣

  • 返回值

SpringBoot微服務(wù)改造過(guò)程是怎樣

2.3 跳轉(zhuǎn)接口修改

之前是通過(guò)SpringMvc的modeAndview方式跳轉(zhuǎn)的,現(xiàn)在做了兩種處理:

  • 改成restful接口的形式,前端控制跳轉(zhuǎn)然后直接獲取數(shù)據(jù)。

  • 直接通過(guò)response.sendRedirect跳轉(zhuǎn)頁(yè)面。

注意:老代碼跳轉(zhuǎn)采用的是通過(guò)SpringMvc在return的頁(yè)面路徑前加redirect的形式,如:return "redirect:index",這樣默認(rèn)會(huì)在return的URL后加jessionID。

2.4 靜態(tài)資源地址變更可能引發(fā)的問(wèn)題

特別需要注意代碼中的相關(guān)校驗(yàn)路徑的地方。比如在這次改造過(guò)程中路徑修改會(huì)影響以下幾個(gè)方面。

  • 菜單權(quán)限校驗(yàn)的時(shí)候,之前人、角色和路徑已經(jīng)綁定了,修改菜單訪問(wèn)路徑會(huì)導(dǎo)致沒(méi)權(quán)限。

  • 掃碼登錄的接口判斷了refer來(lái)源,修改路徑會(huì)導(dǎo)致請(qǐng)求失敗。

  • 之前的sso-dome工程引用了靜態(tài)資源,修改路徑會(huì)報(bào)404。

關(guān)于SpringBoot微服務(wù)改造過(guò)程是怎樣問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI