微服务搭建中遇到的问题

前言

现在我所在的xx公司要重构用户系统。旧用户系统是一个单一应用系统。下游的各个系统通过调用用户系统实现对用户查询、登录、校验、菜单的管理。为了适应新的企业级架构模式,用微服务架构对旧用户系统进行重构。

其实,从单一应用系统到微服务架构的搭建,锻炼的是重构一个旧的单一应用项目的思路:单一应用==》微服务架构应用。

过程如下:

1、从熟悉原有的项目:需求文档、操作手册、数据库设计文档、对外接口、页面原型(对系统进行实操)、对外接口的调用原理。(这里因为我对用户系统不是很熟悉,所以需要从各个方面熟悉用户系统各个功能,如果是对准备金系统进行重构,则简单很多,因为我对准备金系统的功能、表结构设计都非常熟悉(表都是我设计的),而且准备金系统不需要调用其他的微服务来包装本系统的功能)

2、编写开发进度文档;

3、编写新用户系统微服务搭建开发设计文档;

4、查看总公司微服务架构、前后端开发规范、所在公司的架构搭建文档、规范;

4、熟悉微服务架构,各种组件。

5、搭建微服务。

搭建过程中遇到了很多问题,下面对主要的几个进行记录说明。(因为我只在17年接触过一个SOA架构的项目,后来一直在做OA,用的SSM,也没有接触过微服务,对SpringBoot,SpingCloud并不是很熟悉,一切从零开始,Go!!!)。

一、用户系统微服务架构搭建过程中遇到的问题

1、开发环境

开发工具:idea

jdk版本:jdk8

jar包管理:mavn仓库

微服务架构:Springboot+SpringCloud

2、组件如下

3、搭建微服务的过程:

话不多说,咱们本地现在只有一个开发环境(idea、jdk、maven仓库),其他一无所有。我们的项目是前后端分离的,下面先搭建后端架构。

本地也好多软件没安装,各种百度,,,安装,,,报错,,配置,,。搭过本地项目的应该都了解。

3.1、先搭建后端的微服务开发架构:

1、公司架构部门提供了微服务框架的demo,下载demo,导入,

2、配置JDK;

3、配置maven仓库;pom.xml文件报错,不要慌,配置下JDKmaven-Reimport,导入SpringBoot与SpringCloud及相关依赖。

4、所有配置都OK了,启动项目。

5、很完美,开始进入报错、修改、重启、再报错阶段。

6、下面是我的配置文件

application-dev.properties

#配置服务端口server.port= 31010

#  注册中心配置#开发,本地开发时不需要注册eureka.client.service-url.defaultZone=http://localhost:21000/eureka/#获取主机ip作为地址注册到注册中心eureka.instance.prefer-ip-address=trueeureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port}[email protected]@

eureka.client.register-with-eureka=falseeureka.client.fetchRegistry=falseeureka.client.server.waitTimeInMsWhenSyncEmpty=0

# 获取注册信息间隔时间  default 30#eureka.client.registry-fetch-interval-seconds=30# 更新实例变化到服务端 default 30#eureka.client.instance-info-replication-interval-seconds=30# 动态刷新eureka的serviceURl地址的间隔时间  与Config集成需要  default 300#eureka.client.eureka-service-url-poll-interval-seconds=300

#开启健康检查(需要spring-boot-starter-actuator依赖)#eureka.client.healthcheck.enabled = true#租期更新时间间隔(默认30秒)#eureka.instance.lease-renewal-interval-in-seconds =30#租期到期时间(默认90秒)#eureka.instance.lease-expiration-duration-in-seconds =90

#数据库配置spring.datasource.url= jdbc:postgresql://127.0.0.1:5432/imsdbspring.datasource.username= postgresspring.datasource.password= rootspring.datasource.driver-class-name= org.postgresql.Driver

mybatis.type-aliases-package= cn.com.piccre.template.entitymybatis.mapper-locations=classpath:/mapper/*Mapper.xmlmybatis.configuration.map-underscore-to-camel-case=true

#日志扫描logging.level.=infologging.level.cn.com.piccre.template.dao=debuglogging.config=classpath:logback-dev.xml

#apollo配置中心apollo.bootstrap.enabled = true#### apollo server地址apollo.meta=http://10.129.202.74:8080### apollo server的应用idapp.id=ServiceTemplate

#redis配置spring.redis.host=10.129.202.73spring.redis.port=6379spring.redis.password=picc123456spring.redis.timeout=2000

#调用公司用户中心的接口地址#7.3用户登录检查(按用户名和密码形式)—非集成单点(checkLoginByPwd)接口地址check_user_url=http://10.129.202.72:4789/UserTransferServer/userService/check#3.3根据用户获取菜单(getMenuByUser)get_menu_url=http://10.129.202.72:4789/UserTransferServer/userService/menu#10.4根据用户代码获取用户详细信息(getUserMsg)get_user_info=http://10.129.202.72:4789/UserTransferServer/userService/userInfo

#密钥文件用于加密token,将demo附带的密钥文件放于本地目录,只在登录时生成token用到keyPublicPath=F:/cjp/key.pubkeyPrivatePath=F:/cjp/key.pri

bootstrap.properties文件:用以本地测试时切换配置文件application.properties

spring.cloud.config.enabled=false
spring.cloud.config.fail-fast=false
#配置项目的id,注册到eureka时显示的名字,保证注册到eureka时是不重复的
spring.application.name=demo-client
#以下为设置启用哪个环境的配置文件,应保证只开启一个
#开发,即application-dev.properties生效
spring.profiles.active=dev
#configType=dev
#测试,即application-test.properties生效
#spring.profiles.active=test
#configType=test
#生产,即application-prod.properties生效
#spring.profiles.active=prod
#configType=prod

3.1.1 报错一  发布服务失败(没有搭建注册中心)

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
    at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187)
    at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123)
    at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27)
    at com.sun.jersey.api.client.Client.handle(Client.java:652)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)    

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:111)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137)
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134)
    at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1013)    

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
    at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187)
    at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123)
    at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27)
    at com.sun.jersey.api.client.Client.handle(Client.java:652)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)

原因如下:本地导入项目后,并没有对配置文件做任何改动,看配置文件,发现本地根本没有配置服务中心,故不停报上述异常。

解决:关闭eureka注册中心。配置里添加标黄的配置(不向注册中心发布服务,问题解决)

3.1.2 报错二  连接数据库失败

org.postgresql.util.PSQLException: Connection to 127.0.0.1:5433 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:280)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:211)
    at org.postgresql.Driver.makeConnection(Driver.java:458)
    at org.postgresql.Driver.connect(Driver.java:260)

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.postgresql.util.PSQLException: Connection to 127.0.0.1:5433 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:342)

查询是测试环境数据库挂了,好解决,本地安装一个PostgreSQL。(出现JDBC相关的,肯定跟数据库的配置有关)

重启服务,报下述错误。

安装PostgreSQL见链接:

https://www.runoob.com/postgresql/windows-install-postgresql.html

https://blog.csdn.net/qq_36330643/article/details/72763155

https://www.postgresql.org/ftp/source/v10.10/

3.1.2 报错三  连接数据库失败

2020-01-22 09:59:20.904 INFO  [service-template] 11176 [RMI TCP Connection(1)-10.129.206.99] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2020-01-22 09:59:21.901 INFO  [service-template] 11176 [RMI TCP Connection(1)-10.129.206.99] com.zaxxer.hikari.pool.PoolBase - HikariPool-1 - Driver does not support get/set network timeout for connections. (这个 org.postgresql.jdbc.PgConnection.getNetworkTimeout() 方法尚未被实作。)
2020-01-22 09:59:21.919 INFO  [service-template] 11176 [RMI TCP Connection(1)-10.129.206.99] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.

前台提示:

exception":"org.springframework.transaction.CannotCreateTransactionException","message":"Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.","path":"/demo/user/login"}

原因如下:因为我安装的PostgreSQL是最新版本,跟demo的依赖版本不匹配。从maven官网重新下载了标黄的依赖,问题解决。

<dependency>
     <groupId>org.postgresql</groupId>
     <artifactId>postgresql</artifactId>
     <version>9.4.1212.jre7</version>
</dependency>
<!--<dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>42.2.9.jre7</version>
</dependency>-->

3.1.4 报错三  连接数据库失败

The server doesn‘t grant access to the database: the server reports
FATAL: no pg_hba.conf entry for host "192.168.0.123", user "postgres", database "postgres" FATAL: no pg_hba.conf entry for host "192.168.0.123", user "postgres", database "postgres"

PostgreSQL数据库为了安全,它不会监听除本地以外的所有连接请求,当用户通过JDBC访问是,会报一些如下的异常:

org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host

要解决这个问题,只需要在PostgreSQL数据库的安装目录下找到/data/pg_hba.conf,找到“# IPv4 local connections:”

在其下加上请求连接的机器IP

host all all 127.0.0.1/32 md5

32是子网掩码的网段;md5是密码验证方法,可以改为trust

如下图:红色部分都是我修改的。

解决完上述问题,项目终于成功启动,不再报错。

在没有搭建前端开发框架的时候,可以通过postman等工具进行测试。

get方式访问:

3.2、搭建前端的微服务开发架构:

前端用的是Vue框架。

3.2.1 搭建开发环境

搭建前端框架很顺利,公司提供了项目Demo。分为下面几步:

  1. 安装软件:node.js。

      1. 下载安装包,傻瓜式安装即可。
  2. 安装开发工具Sublime。
    1. 下载安装包,https://www.sublimetext.com/3官网下载,傻瓜式安装。
  3. 导入项目
    1. 解压webProject到自己工作目录,例如:D:\workspace\webProject打开Sublime->file->open folder找到刚才解压的webProject目录,选择导入完成。
  4. 下载依赖
    1. 打开cmd命令行,cd到webProject目录下
    2. 输入命令:yarn 回车,等待下载完成。
  5. 本地启动
    1. 打开cmd命令行,cd到webProject目录下
    2. 输入命令:yarn serve
    3. 回车,等待启动完成。
    4. 完成后可以访问默认地址:http://localhost:8080
  6. 打包发布
    1. 打开cmd命令行,cd到webProject目录下
    2. 输入命令:npm run build
    3. 回车,等待打包完成,会在webProject目录下生成一个dist文件夹这个就是打包好的文件,将整个dist上传到nginx服务器配置好的目录下就可以了,由于前端打包好的文件是静态的所以不需要重启即可生效。

通过安装软件,直接启动项目即可。

3.2.2 遇到的问题

1、在项目导入,启动时,用到了命令yarn ,命令行执行,报错,,,没有安装yarn。。需要自己下载安装。

参看链接:https://yarnpkg.com/zh-Hans/docs/install#windows-stable

2、打包时用到了命令npm,需要学习了解。

3、访问http://localhost:8080报错。解决:需要在vue.config.js中配置下后端应用的地址

3.2.3 遇到的问题

上面提到的这些软件工具一个没用过,下面进入学习阶段。

1、node.js是什么?npm?

2、开发Vue的工具?

3、什么是yarn?

参看链接:https://www.cnblogs.com/vole/p/12228658.html

二、本地如何搭建服务中心与网关

1、

三、组件

1、日志监控

ELK+skywalking

2、服务跟踪

3、apollo

四、本地搭建本地虚拟机与Linux

centos

原文地址:https://www.cnblogs.com/vole/p/12222661.html

时间: 2024-10-06 15:59:56

微服务搭建中遇到的问题的相关文章

微服务系统中的认证策略

软件安全本身就是个很复杂的问题,由于微服务系统中的每个服务都要处理安全问题,所以在微服务场景下会更复杂.David Borsos在最近的伦敦微服务大会上作了相关内容的演讲,并评估了四种面向微服务系统的身份验证方案. 在传统的单体架构中,单个服务保存所有的用户数据,可以校验用户,并在认证成功后创建HTTP会话.在微服务架构中,用户是在和服务集合交互,每个服务都有可能需要知道请求的用户是谁.一种朴素的解决方案是在微服务系统中应用与单体系统中相同的模式,但是问题就在于如何让所有的服务访问用户的数据.解

微服务开发中的数据架构设计

本文来自作者 陈伟荣 在 GitChat 分享的文章[微服务开发中的数据架构设计] 前言 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性,可以实现业务之间的松耦合.业务的灵活调整组合以及系统的高可用性.为业务创新和业务持续提供了一个良好的基础平台.本文分享在这种技术架构下的数据架构的设计思想以及设计要点,本文包括下面若干内容. 微服务技术框架中的多层数据架构设计 数据架构设计中的要点 要点1:数据易用性 要点2:主.副数据及数据解耦 要点3:分库分表

微服务架构中APIGateway原理

背景 我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api 风格的接口来被 H5, Android, IOS 以及第三方应用程序调用. 但是在UI上进行展示的时候,我们通常需要在一个界面上展示很多数据,这些数据可能来自于不同的微服务中,举个例子. 在一个电商系统中,查看一个商品详情页,这个商品详情页包含商品的标题,价格,库存,评论等,这些数据对于后端

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们应该如何进行网络请求的优化与处理呢? 到底有没有一些好的建议与方案呢? 下面这个文章将揭晓上面的问题,让你对SpringCloud微服务网络请求性能有一个全新的认识. 目录简介 01.网络请求异常分类 02.开发中注意问题 03.原始的处理方式 04.如何减少代码耦合性 05.异常统一处理步骤 06

微服务架构中整合网关、权限服务

前言:之前的文章有讲过微服务的权限系列和网关实现,都是孤立存在,本文将整合后端服务与网关.权限系统.安全权限部分的实现还讲解了基于前置验证的方式实现,但是由于与业务联系比较紧密,没有具体的示例.业务权限与业务联系非常密切,本次的整合项目将会把这部分的操作权限校验实现基于具体的业务服务. 1. 前文回顾与整合设计 在认证鉴权与API权限控制在微服务架构中的设计与实现系列文章中,讲解了在微服务架构中Auth系统的授权认证和鉴权.在微服务网关中,讲解了基于netflix-zuul组件实现的微服务网关.

SpringCloud微服务搭建(适合初学者)

Spring Cloud 微服务简介 1. 单体应用优化 1.1 可使用SOA面向服务架构(将每个模块分开,某个模块出问题了,不会影响其他模块)    1.2 如果某个服务于其他服务有调用关系,那么就需用到ESB(企业服务总线) 2. 微服务架构 2.1 将单体应用切分为小服务单元 3. Spring Cloud 3.1 是一个工具箱 3.2 基于SpringBoot,封装了Netflix的框架 3.3 将Netflix与Spring容器进行整合 4. Spring Cloud整合的Netfli

微服务----微服务架构中的提取基础组件

一.前言 在第一家公司中,接触到了公司的项目代码,在代码中使用了微服务的功能,使用到了公司封装的xx架构服务,简称为B架构,在B架构中具有基础业务功能服务,比如组织架构服务,日志服务,权限服务. 然后我们在项目中使用B架构中的服务,能够很容器也能很快捷地进行项目的开发,从而避免其他的非核心业务的编写. 二.基础功能组件 这些组件肯定是每一个应用到可以需要使用到的,这些组件是可以提取出来的,比如日志服务.监控服.统计服务.权限服务.认证服务等等.通过微服务的注册发现.配置.网关等,从而搭建出基础功

微服务架构中主流的配置中心对比分析?

为什么需要配置中心 配置实时生效: 传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化.轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中.配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置. 配置管理流程: 配置的权限管控.灰度发布.版本管理.格式检验和安全配置等一系列的配置管理相关的特性也是配置中心不可获取的一部分. 开源配置中心基本介

[从0到1搭建ABP微服务] - 搭建Business微服务

简介 互联网产品主要分为两大类,分别是B端产品和C端产品.B端产品主要管业务(Business)代表系统有ERP.WMS.CRM等,C端产品主要管消费者(Consumer)代表主要就是各种电商网站如淘宝.京东等.本篇文章将基于ABP框架搭建一个Business微服务,后续我会逐渐添加一些实用的业务功能到Business服务中. 新建项目 在MicroServices目录中创建一个新的 asp.net core 项目Business.Host 空项目结果如下: DDD分层 在空项目中使用DDD设计