java-springCloud-使用概述

记录学习及搭建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,监控服务集群的访问情况

你可能感兴趣的:(java-springCloud-使用概述)