前言
现在我所在的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。分为下面几步:
- 安装软件:node.js。
-
- 下载安装包,傻瓜式安装即可。
-
- 安装开发工具Sublime。
- 下载安装包,https://www.sublimetext.com/3官网下载,傻瓜式安装。
- 导入项目
- 解压webProject到自己工作目录,例如:D:\workspace\webProject打开Sublime->file->open folder找到刚才解压的webProject目录,选择导入完成。
- 下载依赖
- 打开cmd命令行,cd到webProject目录下
- 输入命令:yarn 回车,等待下载完成。
- 本地启动
- 打开cmd命令行,cd到webProject目录下
- 输入命令:yarn serve
- 回车,等待启动完成。
- 完成后可以访问默认地址:http://localhost:8080
- 打包发布
- 打开cmd命令行,cd到webProject目录下
- 输入命令:npm run build
- 回车,等待打包完成,会在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