美文网首页
微服务架构

微服务架构

作者: 极速魔法 | 来源:发表于2020-12-20 09:54 被阅读0次

    微服务架构

    微服务

    强调是一个服务的大小,关注的是一个点
    专注个体,每个个体完成一个具体的任务或功能

    微服务架构

    一种架构模式,单一应用划分一组小的服务,服务之间相互配合,为用户提供最终价值。

    SpringCloud和SpringBoot区别?

    • SpringBoot专注于快速方便的开发单个个体服务;

    • SpringCloud关注全局微服务的协调和整理,它将SpringBoot开发的一个个单体微服务整合起来;

    • SpringBoot可以独立使用开发,但是SpringCloud离不开SpringBoot,属于依赖关系;

    • SpringBoot属于一个科室,SpringCloud是综合医院

    Spring boot跨域

    Controller 类 加 @CrossOrigin

    mybatis-plus配置 mapper xml

    mybatis-plus:
      mapper-locations: classpath:mybatis/mapper/*.xml mybatis/mapper
    

    前端数组对象传递

    使用axios发出跨域请求,跟的参数,不允许是数组的格式
    xxx?ids=[7,9]!也就是
    不能使用 paramrs: JSON.stringfy(array)
    改为xxx?0=7&1=9

    解决方案

    springmvc /springboot 接收List 入参_xu990128638的专栏-CSDN博客_springboot接收list参数

    qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })
    // 'a[0]=b&a[1]=c'
    
    qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })
    // 'a[]=b&a[]=c'
    
    qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })
    // 'a=b&a=c'
    

    方案1

    npm install qs
    import qs from 'qs'
    
    
    paramrs: qs.stringfy(array)
    
    // 请求 url,get请求,参数projectIds和 controll方法对应
    http://192.168.0.182:8088/Artilce/xxx?projectIds=1,2,3
    
    // controller方法
    @RequestMapping("/analysis")
    public JsonResult queryList ( @RequestParam("projectIds")  List<Long> projectIds) {
      ...
    }
    
    

    方案二
    post方式

    // 发出post请求,数据格式 json
    {
        "projectIds":[2,3]
    }
    
    // controller
    @RequestMapping("/analysis")
    public JsonResult queryList (@RequestBody ReqVo req) {
        ....
    }
    
    @Data
    Class ReqVo {
        private List<Integer> projectIds;
    }
    

    Redis缓存引入

    依赖引入

    <dependency> 
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</art factId> 
    </dependency>
    

    配置redis

    server:
        port: 8002 
    spring:
        application:
        name: edu-course-boot 
        redis:
            host: 192.168.204.141
            port: 6379
    

    redis放在service层

    1. redis查询数据
    2. redis没有,去mysql查询
    3. 将查询结果缓存在redis中
    @Service 
    public class CourseServiceImpl implements CourseService {
    
        @Autowired
        private CourseMapper courseMapper;
    
        @Autowired 
        private RedisTemplate<Object,Object> redisTemplate;
    
        @Override public List<Course> getAllCourse() { 
        //将redis内存中的序列化的集合名称用String重新命名(增加可读性)
             RedisSerializer rs = new StringRedisSerializer();
             redisTemplate.setKeySerializer(rs);
            
             System.out.println("查询redis");
            
             List<Course> list =        
    (List<Course>)redisTemplate.opsForValue().get("allCourses");        if(list == null){ 
                    //去数据库      
                System.out.println("====MySql数据库====");
            
                list = courseMapper.getAllCourse(); 
    
                // 把从数据库查询的集合放在redis内存中(key,value,过期秒数,秒的工具类)
                redisTemplate.opsForValue().set("allCourses", list,10, TimeUnit.SECONDS);
            }
    
            return list;
    }
    

    高并发下的双层检测锁

    @Override 
    public List<Course> getAllCourse() {
        RedisSerializer rs = new StringRedisSerializer(); redisTemplate.setKeySerializer(rs);
    
        System.out.println("查询redis");
        List<Course> list =(List<Course>)redisTemplate.opsForValue().get("allCourses"); 
    
            // 第一次检测
        if(list == null){ 
            //排队,让第一个人进,走一遍流程(后面的人就会走缓存了) 
            synchronized (this){ 
                list = (List<Course>)redisTemplate.opsForValue().get("allCourses"); 
                    // 第二次检测
                    if(list == null){ 
                    //去数据库
                    System.out.println("====MySql数据库====");
                    list = courseMapper.getAllCourse(); 
                    // 把从数据库查询的集合放在redis内存中 
                    redisTemplate.opsForValue().set("allCourses", list,10,TimeUnit.SECONDS); 
                }
            }
        }
        return list;
    }
    

    保证redis中数据最新

    1. 如果课程中内容发生变化,更新 ,修改内容的时候,会先将redis中的相关集合删除。
    2. 然后将最新的数据保存到数据库 而查询数据时,因为redis中的数据已经删除了,所以会第一时间去数据库查询,保证数据是最新 的。

    三步解决 IDEA ‘Error:java: 无效的源发行版: 11’
    三步解决 IDEA ‘Error:java: 无效的源发行版: 11’_Java持续实践-CSDN博客

    IDEA集成Docker部署微服务

    docker 安装配置

    yum -y install docker
    systemctl start docker
    vim /lib/systemd/system/docker.service
    # 修改
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
    
    systemctl daemon-reload
    
    #重启
    service docker restart
    # 查看端口是否开启
    netstat -nlpt
    # 验证端口是否生效
    curl http://192.168.204.141:2375/info
    

    idea安装docker插件

    Tcp socket :tcp://ip:2375
    setting —>docker Registry address :https://owi3yzzk.mirror.aliyuncs.com
    连接服务器

    docker mavne插件

    <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>1.0.0</version>
        <configuration>
            <!--镜像名称 laosun/test-docker-demo-->
            <imageName>laosun/${project.artifactId}</imageName>
            <!--标签版本-->
            <imageTags>
                <imageTag>latest</imageTag>
            </imageTags>
            <!--基础镜像,相当于Dockerfile里的from-->
            <baseImage>openjdk:11.0.9.1-jdk-buster</baseImage>
            <!--标签版本-->
            <maintainer>laosun angiersun@lagou.com</maintainer>
            <!--入口点,project.build.finalName就是project标签下的build标签下的filename标签内容,test-docker-demo-->
            <!--相当于启动容器后,会自动执行java -jar/test-docker-demo.jar-->
            <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
            <!--docker地址-->
            <dockerHost>http://xxx:2375</dockerHost>
    
            <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
            <resources>
                <resource>
                    <targetPath>/</targetPath>
                    <!--复制的根目录,target-->
                    <directory>${project.build.directory}</directory>
                    <!--把哪个文件上传到docker,相当于Dockerfile里的add test-docker-demo.jar /-->
                    <include>${project.build.finalName}.jar</include>
                </resource>
            </resources>
        </configuration>
    </plugin>
    
    

    对项目进行打包并构建镜像到docker上

    mvn clean package docker:build

    相关文章

      网友评论

          本文标题:微服务架构

          本文链接:https://www.haomeiwen.com/subject/xaghnktx.html