微服务搭建中遇到的问题

前言

现在我所在的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=true
eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port}
[email protected]@

eureka.client.register-with-eureka=false
eureka.client.fetchRegistry=false
eureka.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/imsdb
spring.datasource.username= postgres
spring.datasource.password= root
spring.datasource.driver-class-name= org.postgresql.Driver

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

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

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

#redis配置
spring.redis.host=10.129.202.73
spring.redis.port=6379
spring.redis.password=picc123456
spring.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.pub
keyPrivatePath=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

猜你喜欢

转载自www.cnblogs.com/vole/p/12222661.html