记录学习及搭建springcloud过程的问题及想法。
1:整体流程
client-->nginx-->微服务(springcloud+springboot)
2:构建springcloud
2.1:主要部件:eureka(基础的服务,服务注册及发现)将springboot服务注册在springcloud框架中进行管理。
eureka-server(建立一个单独的集群,高可用)
eureka-client(在springboot的项目中引用,让项目在eureka-server中注册服务)
使用:eureka-server:创建一个单独的集群,eureka-client:与springboot项目在一起。
2.2:问题及解决,那么多springboot项目,如何相互之间调用呢?
ribbon/feign:(这两个主件都可以,单纯从应用上说明为啥使用feign)
理由: 使用ribbon,需要定义http,一般采用restTemplate,这样去做接口的调用有点low。
采用feign形式只需要把调用的服务定义成接口形式,然后引入调用即可)
使用:与springboot项目在一起。
2.3:问题及解决,配置文件要重复写(比如连接数据库的配置),且如果变化配置还需要重启项目,怎么能统一配置,且修改配置不用重启服务就有效呢?
config:(配置主件)
做法:1:需要git支持(这里采用git方式,将配置文件传到git,让微服务读取git中的配置)
git的使用:git的创建,仓库搭建,本地仓库与远程仓库的同步
1:注册github用户,登录
2:settings设置SSH
$ ssh -T [email protected] 验证是否成功
3:在projects中创建工程
+下的new repository(我的创建的工程名是config,所以下面的地址是config.git)
[email protected]:zhaodabao140/config.git(选用SSH的形式,如果是http的提交会提示输入账号密码)
4:在本地的仓库与远程仓库关联同步
git remote add origin [email protected]:zhaodabao140/config.git
2:项目中的使用:
2.1:在config集群的配置文件中
#config是我之前创建的git工程名,用于存放配置
spring.cloud.config.server.git.uri=https://github.com/zhaodabao140/config
#读取的配置文件在git中的文件目录
spring.cloud.config.server.git.searchPaths=spring-test
#读取的 分支,默认读取master
spring.cloud.config.label=master
#如果git中写的配置是public的就不用在这写git访问的用户名密码
2.2:在springboot的项目配置中
#开启读取权限
spring.cloud.config.discovery.enabled=true
#读取的在eureka中注册的名称
spring.cloud.config.discovery.service-id=config-server
我写在git中的配置名称是 application-test.properties
spring.cloud.config.name=application
spring.cloud.config.profile=test
3:配置写好了,怎么让项目可以读取到配置呢?
如果只是配置到这里,那么就需要执行:http://localhost:9005/actuator/XXX,即哪个服务需要读取配置就找到对应服务的地址执行,很麻烦,
集群一般都不会单一去执行,所以需要结合springcloud中的另外一个主件bus。
4:如何解决config高可用的问题?
我的做法是建立config集群,这个集群在eureka中注册的服务名是同一个名字。
5:现在项目有开发环境,测试环境,生产环境,怎么部署的项目读取对应的配置呢?
查阅了一些资料,当前的就是不同配置写在git的不同文件或者目录下,或者在一个人文件中,按不同名字配置,项目读取时候指定读取的文件或者
使用哪个名字下的配置。(还是觉得这个不够灵活,不知道有没有其他的方法)
遇到的问题:
1:项目中的application.properties改名为bootstrap.properties(注意:修改的是config client中的,不是server中的)
原因:否则项目启动失败,找不到配置的信息,报空指针异常,bootstrap的优先级大于application,会先读取bootstrap,再读取application。
2:注册eureka的配置还是要写在项目的application.properties中
原因:否则找不到注册的是什么服务
3:获取的配置文件会不会中文乱码的问题?(亲测,可用,可能由于版本问题修改的方法有些变化,但是根本的还是把文件重写,改为UTF-8,
疑问点:对于这种的问题,springcloud config应该会类似的配置才应该啊,或是我没有发现吗?)
解决:参考 https://www.cnblogs.com/xifenglou/p/11177581.html
使用:创建一个单独的集群。
2.4:问题及解决,基上文所说,配置了git,然后分别执行,让客户端读取最新配置。引入bus?
bus:(总线,将config配置统一管理,执行bus一个,整个集群中所有的config都刷新了最新配置)
做法:1:需要消息队列支持(bus将配置改变的消息发到队列中,所有config应用得到消息后都去获取最新配置)
2:在config集群的配置文件中
#bus-refresh,自定义配置,用于刷新bus读取配置的地址,比如 http://localhost:9005/actuator/bus-refresh 执行之后就是刷新配置
management.endpoints.web.exposure.include=bus-refresh
#开启bus
spring.cloud.bus.enabled=true
spring.cloud.bus.trace.enabled=true
#我用的是kafka
spring.kafka.bootstrap-servers=node01:9092,node02:9092,node02:9092
3:在springboot项目的配置文件中(只需要配置消息队列即可)
spring.kafka.bootstrap-servers=node01:9092,node02:9092,node02:9092
4:spring-cloud-starter-bus-kafka jar包还是需要配置上的
5:配置完成,改变git的配置文件信息,执行http://localhost:9005/actuator/bus-refresh即可,localhost:9005是我的地址及端口信息
问题及解决:
1:有说可以实现只要改变了git,不用手动执行,依然可以自动刷新配置?(下面是找的一些资料,我没有实现出来,操作之后查询log,网络访问没有通)
通过配置 Git 仓库 WebHooks 来自动调用接口
ngrok
https://www.jianshu.com/p/55209f1031e8
./ngrok http 4567 4567是端口号(linux) ngrok http 4567(windows)
https://cloud.tencent.com/developer/article/1499928
http://f47b44c5.ngrok.io
使用:与config集群在一起,与springboot项目在一起,两边配置。
2.5:问题及解决,上面的一个基本的微服务搭建出来了,需要完善一些东西,比如熔断机制?
hystrix(用于服务的熔断,防止项目雪崩,即如果特别大的高并发或者有服务挂掉了,客户端一直等待返回结果)
做法:1:feign配置是一个接口,所以只需要写一个feign接口的实现类 即可,实现类用@Component注解让该类交与spring容器管理即可。
在实现类中的方法即是如果发生问题需要怎么做的具体逻辑。
注意:这个是有策略的:参考 https://blog.csdn.net/fu_huo_1993/article/details/88350169
信号量隔离:调用线程与服务线程是同一个线程,需要服务线程可用性高反应速度快。
线程隔离(默认):调用线程与服务线程不是同一个线程,默认服务线程池大小10个,这个耗资源。
使用:在springboot项目中与feign整合使用。
2.6:问题及解决,应用都需要安全认证及权限认证,之前知道的做法是有的利用安全权限框架,有的会自定义注解,有的用拦截器?
zuul(过滤器:用于身份权限认证,路由)这个是nginx访问到微服务的第一道屏障,过了这个之后请求会被路由到相应的服务上。
做法:1:在单独的集群配置中,配置route
# project是路由名称,名称任意,保持所有路由名称唯一
zuul.routes.project.path=: /project/**
#微服务名称,网关会从eureka中获取该服务名称下的服务实例的地址
zuul.routes.project.serviceId: project
#url: http://www.baidu.com #也可指定url,此url也可以是外网地址\
#true:代理转发时去掉前缀,false:代理转发时不去掉前缀
zuul.routes.project.strip-prefix: false
#默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取消默认的黑名单,如果设置了具体的头信息则不会传到下游服务
zuul.routes.project.sensitiveHeaders:
#ignoredHeaders: 默认为空表示不过虑任何头
2:自定义类继承ZuulFilter
run():要执行的逻辑。
shouldFilter():是否执行这个过滤器,true是执行,可以在这个里面加一些逻辑,判断是否需要过滤。
filterOrder():这个过滤器的执行顺序,越小优先级越高。
filterType():需要配置的过滤器类型。
pre 为路由前:请求发过来时候触发的
route为路由过程中:请求进来了,进行一个服务分发过程
post 为路由过程后:获取到了返回的结果,这里可以对结果进行一个处理,然后返回给客户端
error 为出现错误的时候:出现报错什么处理的
使用:创建单独的集群
2.7:问题及解决,项目已经搭建完成,如果的管理及部署集群?
docker+k8s+微服务
docker: (一个简化的虚拟机,将项目及环境等信息都包装起来,传到docker服务器,什么地方想运行就直接拉取下来之后直接运行即可)
参考:https://blog.csdn.net/q610376681/article/details/90483576
执行步骤:build:创建影像 ship:发送到docker服务器 pull:拉取影像 run:运行影像
k8s:https://blog.csdn.net/weixin_43277643/article/details/83382532
2.8:问题及解决,turbin,监控服务集群的访问情况