• SpringCloud


    1、微服务架构

    2、SpringCloud

    springcloud是一系列微服务功能的结合体。采用了多种技术。  

     1、payment

    环境搭建:

    1、父工程创建:POM方式打包,dependiencesManagerment 与dependices区别。

    2、子工程创建;

      新建项目

      改POM

      写yml

      写主运行类

      写业务

    • 建表
    • entities
    • dao
    • service
    • controller

      测试

    @Param注解的作用

      用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中

      我们先来看Mapper接口中的@Select方法

    复制代码
    package Mapper; 
    @Mapper public interface Mapper {   @Select("select s_id id,s_name name,class_id classid from student where s_name= #{aaaa} and class_id = #{bbbb}") public Student select(@Param("aaaa") String name,@Param("bbbb")int class_id);   @Delete......   @Insert...... }
    复制代码

      1、@Select(……)注解的作用就是告诉mybatis框架,执行括号内的sql语句

      2、s_id id,s_name name,class_id classid  格式是 字段名+属性名,

      例如s_id是数据库中的字段名,id是类中的属性名

      这段代码的作用就是实现数据库字段名和实体类属性的一一映射,不然数据库不知道如何匹配

      3、where  s_name= #{aaaa} and class_id = #{bbbb} ,表示sql语句要接受2个参数,一个参数名是aaaa,一个参数名是bbbb;

      如果要正确的传入参数,那么就要给参数命名,因为不用xml配置文件,那么我们就要用别的方式来给参数命名,这个方式就是@Param注解

      4、在方法参数的前面写上@Param("参数名"),表示给参数命名,名称就是括号中的内容

      public Student select(@Param("aaaa") String name,@Param("bbbb")int class_id);

      给入参 String name 命名为aaaa,然后sql语句....where  s_name= #{aaaa} 中就可以根据aaaa得到参数值了。

      5、如果传入的参数是基本类型参数和实体类对象。

    public List<student> selectuser(@Param(value = "page")int pn ,@Param(value = "st")student student);
    
    <select id="selectuser" resultType="com.user.entity.student">
        SELECT * FROM student
        where sname like concat(concat("%",#{st.sname}),"%")
        LIMIT #{page} ,5
    </select>

    @Mapper与@Resposity

    https://blog.csdn.net/Xu_JL1997/article/details/90934359

    1. @Mapper 一定要有,否则 Mybatis 找不到 mapper。
    2. @Repository 可有可无,可以消去依赖注入的报错信息。
    3. @MapperScan 可以替代 @Mapper。

    @Resource 与@Autowried

    https://blog.csdn.net/weixin_40423597/article/details/80643990

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

     @Slf4j

    声明:如果不想每次都写private  final Logger logger = LoggerFactory.getLogger(当前类名.class); 可以用注解@Slf4j;

    1.使用idea首先需要安装Lombok插件;

    2.在pom文件加入lombok的依赖

    <dependency>

       <groupId>org.projectlombok</groupId>

       <artifactId>lombok</artifactId>

        <version>1.16.16</version><!--版本号自己选一个就行-->

    </dependency>

    3.类上面添加@Sl4j注解,然后使用log打印日志;

     @MapperScan():用于扫描mapper与componentscan不同。

    Devtools:

    自动热部署

    服务注册中心:

    Eureka:

     

     

     

    Eureka使用流程:

    1、idea生成eurekaServer端服务注册中心,类似物业公司。
    2、eurekaClient端cloud-provider-payment8001将注册进eurekaServer成为服务提供者,类似尚硅谷对外提供授课服务。
    3、eurekaClient 端cloud-consumer-order80将注册进eurekaServer成为服务消费者,类似尚硅谷上课消费的同学。

    @EnableEurekaServer 用于表明当前模块为注册中心

    https://blog.csdn.net/TP89757/article/details/100877037

    spring-boot-starter-actuator(健康监控)配置和使用

    在生产环境中,需要实时或定期监控服务的可用性。Spring Boot的actuator(健康监控)功能提供了很多监控所需的接口,可以对应用系统进行配置查看、相关功能统计等。

    不同服务之间的调用可以用spring的RestTemplate :
     
     
    Eureka集群:保证服务注册中心的高可用。

     

    RPC:远程过程调用

    https://www.jianshu.com/p/7d6853140e13

     
    集群核心策略:互相注册,相互守望。
     

     Eureka集群环境构建步骤:

    1、参考cloud-eureka-server7001创建7002端口项目;

    2、改pom

    3、修改映射配置

    4、写yml

    5、主启动

    service服务的集群:

    1、取消consumer80服务写死的的地址。改为服务名称;

    2、使用@LoadBalanced 注解赋予RestTemplate负载均衡的能力,默认轮询,加在restTemplate bean定义上。

    Actuator微服务信息完善:

    1、主机名,服务名修改。  

    2、访问信息有ip显示。

    添加以下信息

      instance:
        instance-id: payment8002
        prefer-ip-address: true

    服务发现Discovery:

    通过discoveryClient获取发现信息

        @GetMapping("/payment/discovery")
        public Object discovery(){
            List<String> services = discoveryClient.getServices();
            for(String service:services){
                log.info("***service:"+service);
            }
    
            List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
            for(ServiceInstance instance:instances){
                log.info("instance: "+instance.getHost()+":"+instance.getPort());
            }
    
            return discoveryClient;
        }

    使用@EnableDiscoveryClient开启功能

    保护模式:

     

     

     禁止自我保护:

    服务注册中心增加yml

    eureka:
      server:
        #关闭默认保护机制
        enable-self-preservation: false
        #2s后就关闭
        eviction-interval-timer-in-ms: 2000

    服务提供者添加:减少心跳发送间隔,减小eureka删除服务时间

    eureka:
      instance:
        lease-renewal-interval-in-seconds: 1
        lease-expiration-duration-in-seconds: 2

       

    Zookeeper:

    1、新建子模块

    2、启动POM

    3、YML

    4、主启动类

    5、Controller

    6、启动8004注册进zookeeper(有jar包冲突时需排除)

    7、验证zookeeper的service是否包含payment。

    zookeeper注册中心是持久还是临时?

    zookeeper的服务节点是临时的,心跳时间超出后删除服务。

    Consul:

    1、简介

     

    2、安装运行

    安装说明:官网learn.hashicorp.com

    在cmd中启动。

    使用开发模式启动: consul agent -dev.

    3、将服务提供者注册进consul。

    使用方式与zookeeper类似

    4、将服务消费者注册进consul。

    在使用springcloud客户端负载均衡的时候,可以给RestTemplate bean 加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能力:

    三个注册中心异同点:

    CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
    一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
    可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
    分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
    CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。如果在某个分布式系统中数据无副本, 那么系统必然满足强一致性条件, 因为只有独一数据,不会出现数据不一致的情况,此时C和P两要素具备,但是如果系统发生了网络分区状况或者宕机,必然导致某些数据不可以访问,此时可用性条件就不能被满足,即在此情况下获得了CP系统,但是CAP不可同时满足 [1]  。
    因此在进行分布式架构设计时,必须做出取舍。当前一般是通过分布式缓存中各节点的最终一致性来提高系统的性能,通过使用多节点之间的数据异步复制技术来实现集群化的数据一致性。通常使用类似 memcached 之类的 NOSQL 作为实现手段。虽然 memcached 也可以是分布式集群环境的,但是对于一份数据来说,它总是存储在某一台 memcached 服务器上。如果发生网络故障或是服务器死机,则存储在这台服务器上的所有数据都将不可访问。由于数据是存储在内存中的,重启服务器,将导致数据全部丢失。当然也可以自己实现一套机制,用来在分布式 memcached 之间进行数据的同步和持久化,但是实现难度是非常大的

     

      

     

     Ribbon:

     

     eureka包含了ribbon.

     

    负载均衡策略:

     

    新建配置类:

    @Configuration
    public class MyselfRule {
    
        @Bean
        public IRule myRule(){
            return new RandomRule();//随机选择
        }
    }

    该配置类不可放于能被ComponentScan扫描的地方。

     主启动类添加

    @RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration = MyselfRule.class)

    Ribbon负载均衡算法.

     手写负载均衡时要取消默认的loadbalance

    https://blog.csdn.net/majinan3456/article/details/99352894

    ribbon与nginx负载均衡有什么区别:

      1. Nginx服务器端负载均衡:

        nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发,属于服务器端负载均衡。
        既请求有nginx服务器端进行转发。

      2. Ribbon客户端负载均衡:

        Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,让后在本地实现轮训负载均衡策略。
        既在客户端实现负载均衡。

      3. 应用场景的区别:

        Nginx适合于服务器端实现负载均衡 比如Tomcat ,Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,比如Dubbo、SpringCloud中都是采用本地负载均衡。

    OpenFeign

     

     

     

     

     超时:配置ribbon超时时间。ms

    ribbon:
      ConnectTimeout: 5000
      ReadTimeout: 5000

    日志:

     增加配置:

    logging:
      level:
        #feign日志以什么级别监控哪些接口
        com.springcloud.service.PaymentService: debug

    注入bean

    @Configuration
    public class FeignConfig {
    
        @Bean
        Logger.Level feignLoggerLevel(){
            return Logger.Level.FULL;
        }
    }

     Hystrix:

    服务降级

     

     通过jmeter添加压力测试:

    正常方法开始卡顿

      超时导致服务器变慢:转圈,超时不在等待。

    出错:程序运行出错。

     

     

    服务熔断:

     

     

     

     

     

    服务网关:

    zuul:

    gateway:

     

    特性: 

     

        /*进行全局请求参数过滤*/
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            log.info("************进入全局过滤器");
            String uname = exchange.getRequest().getQueryParams().getFirst("uname");
            if(uname == null){
                log.info("请求参数不对");
                exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
                return exchange.getResponse().setComplete();
            }
            return chain.filter(exchange);
        }

     config

     

     

    bootstrap.yml配置

     

     配置文件修改后服务端响应较快,客户端响应较慢,重启后才能更新。

    需要动态刷新:

    1、添加

    @RefreshScope//刷新功能
    注解

    2、发送 curl -X POST "http://localhost:3355/actuator/refresh"

     BUS消息总线

     

     

     

     

     stream

    对不同的mq提供统一服务。

    重复消费:

     

    分组原理: 

     

    持久化:

    一定要使用分组。

  • 相关阅读:
    JAVA Number类
    ConcurrentHashMap.Segment源码解析
    Java Concurrent包初探
    JAVA枚举类
    构造不可变类及其优点
    Unsafe类初探
    Paxos made simple 翻译尝试
    平行二叉堆和优先队列
    Android OpenCV学习
    Android-Java和HTML5交互-混合开发-优化
  • 原文地址:https://www.cnblogs.com/baldprogrammer/p/13773924.html
Copyright © 2020-2023  润新知