相比Springboot开发,SpringCloud开发要复杂的多,因为涉及服务的注册发现,多个微服务模块间的调用等。
最简单的解决方案是每个开发者都在本地启动一套完整的开发环境,包括网关、nacos等各个组成微服务的模块,如果系统模块较少,这种开发方案还可以接受,如果系统太多,本地启动整套环境比较占用本地资源。
微服务注册问题
像下面这张图,倒数第二个服务启动了两个实例,他们两个组成了一个集群。前端在调用接口的时候可能想调用A的该服务,但是可能会被路由到B的该服务上去了,这种情况是我们不希望看到的。
我们想要看到的效果是,A、B两个开发者将自己的功能开发完以后提交到服务器部署。前端可以调用到这些开发好、经过后端自测的服务接口,后端在提交自己的代码之前,不应该注册到集群中。
为了解决上述问题,可以在bootstrap.yml文件中加入下面配置。开启如下配置以后,启动服务将不再注册到nacos中,前端调用也不会再调用到该服务。
server:
port: 3001
# 加入下面配置,取消该服务的注册
spring:
cloud:
nacos:
discovery:
register-enabled: false
后端如果想要调用自己开发的接口,可以直接通过http://localhost:3001/接口地址调用并测试,等测试接口没问题以后可以提交自己的代码并部署,部署完成以后前端可以调用接口进行开发。
微服务间调用问题
在微服务中可以通过OpenFeign,使用微服务名称进行微服务间的调用,但是同样的,如果本地开发,我们可能想让某个请求转发到某个特定的服务上,而不是通过微服务名称进行负载均衡转发,为了将请求转发给特定的服务,可以在@FeignClient注解中指定要请求的URL,如下,是将RemoteUserService类的请求转发给http://172.20.2.3:11201服务了。注意这样写是为了本地开发方便调试,如果要提交代码需要将这些代码去掉。
@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, url = "http://172.20.2.3:11201", fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService
{
/**
* 通过用户名查询用户信息
*
* @param username 用户名
* @param source 请求来源
* @return 结果
*/
@GetMapping("/user/info/{username}")
public R<LoginUser> getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
第二种方式是自定义负载均衡策略,可以参考这篇博文:
解决Springcloud Nacos 开发环境多服务在线乱入问题_nacos 开发环境多实例问题_陕西小伙伴网络科技有限公司的博客-CSDN博客
前后端联调问题
正常的前后端联调应该是后端写好代码,将代码合并到开发分支上面,部署开发分支,前端连接开发分支进行调试。
如果实在想要本地实现前后端联调,可以在前端分别配置微服务各个模块的地址,实现调用,但是也会存在一些问题,需要单独解决。(不推荐)
解决Springcloud Nacos 开发环境多服务在线乱入问题_nacos 开发环境多实例问题_陕西小伙伴网络科技有限公司的博客-CSDN博客
总结
上述三种情况其实本质上都是一个问题,即微服务场景下的协同开发问题。
由于各种原因,在企业开发中可能出现如下情况:
1. 启动全套微服务内容(网关/nacos/认证中心/业务模块等),开发太占资源,只想开发什么模块就启动什么模块
2. 基于问题一,可能会产生一系列问题