如何解决通过网关无法调用本地注册微服务

相信不少人在工作中使用spring cloud微服务架构进行开发一个微服务时往往只需要关注这一个微服务的业务功能开发,但在实际情况是各个微服务相互关联,让你没办法很好的单服务模块开发,因此本文就向大家分享一个在工作中使用公司内网服务器作为eureka注册中心和zuul网关,然后在开发时将本地微服务注册到服务器注册中心,通过网关路由微服务的方案。

一、确保服务器与本地网络互通

第一步没的说,网络通畅才是保证微服务调用正常的前提,各位攻城狮若不太能搞定这点,可以让公司的运维大佬帮忙解决。

搞定一个可以在本地与服务器上互ping一下,通了就没问题了,如果本地是windows的话,需要关闭公用网络的防火墙,否则zuul无法正常需本地的微服务通讯。

二、将eureka-server与zuul部署到服务器

在本地编写一个eureka-server和zuul,如何不知道怎么编写可以查看我其他文章。

1、搭建eureka-server

要注意的是这里的eureka-server的application.properties中一个点必须注意:不能使用eureka.instance.prefer-ip-address=false,需使用以下配置,并且不能添加spring.application.name这项配置

eureka.instance.prefer-ip-address=true
eureka.instance.hostname= ${spring.cloud.client.ipAddress}
eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port} 

有些小伙伴因为使用的spring cloud版本,在运行erueka-server时可能会报下述错误

 Could not resolve placeholder 'spring.cloud.client.ipAddress' in value "${spring.cloud.client.ipAddress}"

我们只需要查看org.springframework.cloud.client.HostInfoEnvironmentPostProcessor这个类里面的一个方法就知道原因了

在spring-cloud较新的版本已经将spring.cloud.client.ipAddress改为spring.cloud.client.ip-address了,因此我们配置文件中对应修改即可。

eureka.instance.prefer-ip-address=true
eureka.instance.hostname= ${spring.cloud.client.ip-address}
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port} 

此时我们就可以成功运行eureka-server了。

2、搭建zuul

创建zuul的步骤省略,我这里只提出需要注意的地方。

在开发工作中,我们为了方便前期开发工作需要在zuul中解决跨域问题,在zuul的入口函数中添加以下配置:

package com.harris.zuulserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * @author HCJ
 */
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ZuulServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServerApplication.class, args);
    }

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(source);
    }
}

同时在appliction.properties中配置

zuul.sensitive-headers=Access-Control-Allow-Origin
zuul.ignored-headers=Access-Control-Allow-Origin,H-APP-Id,Token,APPToken

即可一次性解决开发过程中的跨域问题,无需在前端和各个微服务中再配置,若在微服务中再配置跨域问题,将会请求时冲突报错。

接下来我们像eureka-server配置一样进行配置修改:

spring.application.name=zuul-server
server.port=13000

eureka.instance.prefer-ip-address=true
eureka.instance.hostname= ${spring.cloud.client.ipAddress}
eureka.instance.instance-id= ${spring.cloud.client.ipAddress}:${server.port}

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

此时zuul的主要配置就完成了。若各位需要增加鉴权、回退的功能自行添加即可。

3、打包jar部署至服务器

将spring boot项目打包为jar大家十分熟练了,若大家对在服务器部署jar有疑问的话,可以查看我的这边问题,内讲述windows、linux下后台部署jar的方法:windows、linux如何后台运行jar(并且显示进程名)

三、将本地微服务注册到服务器的eureka-server

这里需要特别注意的一点时,所有的微服务中的配置都不能使用eureka.instance.prefer-ip-address=false来使用主机名进行资产,都需要使用以下配置:

eureka.instance.prefer-ip-address=true
eureka.instance.hostname= ${spring.cloud.client.ipAddress}
eureka.instance.instance-id= ${spring.cloud.client.ipAddress}:${server.port}

否则在本地通过服务器的网关调用本地的微服务将会报如下错误:

{
    "timestamp": "2019-03-28T06:06:14.909+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "GENERAL"
}

关于微服务的其余地方就没有区别了。在服务器运行了eureka-server和zuul后,正常启动本地微服务即可。

四、调用测试

访问服务器的eureka,可以看到之前部署的zuul(zuul-server)和本地运行的微服务t-asset。

接下来调用本地微服务的测试一下:

可以看到本地的微服务通过服务器的网关调用成功。

 

收编不易,转载注明来源,谢谢大家!

若有疑问欢迎评论留言。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lamp-cloud的前身是zuihou-admin-cloud,从3.0.0版本开始,改名为lamp-cloud,它是lamp项目的其中一员。   lamp-cloud是一个基于SpringCloud(Hoxton.SR10) + SpringBoot(2.3.10.RELEASE)的SaaS微服务脚手架,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API、分布式事务、大文件断点分片续传等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用Nacos、Fegin、Ribbon、Zuul、Hystrix、JWT Token、Mybatis、SpringBoot、Redis、RibbitMQ等主要框架和中间件。 lamp-cloud功能: 1、服务注册&发现与调用: 基于Nacos来实现的服务注册与发现,使用使用Feign来实现服务互调, 可以做到使用HTTP请求远程调用时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。 2、服务鉴权: 通过JWT的方式来加强服务之间调度的权限验证,保证内部服务的安全性。 3、负载均衡: 将服务保留的rest进行代理和网关控制,除了平常经常使用的node.js、nginx外,Spring Cloud系列的zuul和ribbon,可以帮我们进行正常的网关管控和负载均衡。其中扩展和借鉴国外项目的扩展基于JWT的Zuul限流插件,方面进行限流。 4、熔断机制: 因为采取了服务的分布,为了避免服务之间的调用“雪崩”,采用了Hystrix的作为熔断器,避免了服务之间的“雪崩”。 5、监控: 利用Spring Boot Admin 来监控各个独立Service的运行状态;利用turbine来实时查看接口的运行状态和调用频率;通过Zipkin来查看各个服务之间的调用链等。 6、链路调用监控: 利用Zipkin实现微服务的全链路性能监控, 从整体维度到局部维度展示各项指标,将跨应用的所有调用链性能信息集中展现,可方便度量整体和局部性能,并且方便到故障产生的源头,生产上可极大缩短故障排除时间。有了它,我们能做到: 请求链路追踪,故障快速定位:可以通过调用链结合业务日志快速定位错误信息。 可视化:各个阶段耗时,进行性能分析。 依赖优化:各个调用环节的可用性、梳理服务依赖关系以及优化。 数据分析,优化链路:可以得到用户的行为路径,汇总分析应用在很多业务场景。 7、数据权限 利用基于Mybatis的DataScopeInterceptor拦截器实现了简单的数据权限 8、SaaS(多租户)的无感解决方案 使用Mybatis拦截器实现对所有SQL的拦截,修改默认的Schema,从而实现多租户数据隔离的目的。 并且支持可插拔。 9、二级缓存 采用J2Cache操作缓存,第一级缓存使用内存(Caffeine),第二级缓存使用 Redis。 由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。 该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的缓存冷启动后对后端业务的冲击。 10、优雅的Bean转换 采用Dozer组件来对 DTO、DO、PO等对象的优化转换 11、前后端统一表单验证 严谨的表单验证通常需要 前端+后端同时验证, 但传统的项目,均只能前后端各做一次检验, 后期规则变更,又得前后端同时修改。 故在hibernate-validator的基础上封装了zuihou-validator-starter起步依赖,提供一个通用接口,可以获取需要校验表单的规则,然后前端使用后端返回的规则, 以后若规则改变,只需要后端修改即可。 12、防跨站脚本攻击(XSS) 通过过滤器对所有请求中的 表单参数 进行过滤 通过Json反序列化器实现对所有 application/json 类型的参数 进行过滤 13、当前登录用户信息注入器 通过注解实现用户身份注入 14、在线API 由于原生swagger-ui某些功能支持不够友好,故采用了国内开源的swagger-bootstrap-ui,并制作了stater,方便springboot用户使用。 15、代码生成器 基于Mybatis-plus-generator自定义了一套代码生成器, 通过配置数据库字段的注释,自动生成枚举类、数据字典注解、SaveDTO、UpdateDTO、表单验证规则注解、Swagger注解等。 16、定时任务调度器: 基于xxl-jobs进行了功能增强。(如:指定时间发送任务、执行器和调度器合并项目、多数据源) 17、大文件/断点/分片续传 前端采用w

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值