zoukankan      html  css  js  c++  java
  • SpringCloud-01-Restful服务


    背景

    微服务

    原文 https://martinfowler.com/articles/microservices.html
    汉化 https://www.cnblogs.com/liuning8023/p/4493156.html

    微服务架构4个核心问题(主要原因是“网络不可靠丶”):

    1.服务很多,客户端怎么访问
    2.这么多服务,服务之间如何通信
    3.这么多服务,如何治理
    4.服务挂了怎么办

    企业解决方案(解决以上4个问题)

    1.Dubbo+Zookeeper+SpringBoot(半自动,需要整合其他东西)
    api网关:找第三方组件,或自己实现
    Dubbo通信(异步,非阻塞)
    Zookeeper服务治理
    Hystrix熔断机制
    
    2.SpringCloud(Netflix)+SpringBoot(一站式解决方案)
    api网关:zuul组件(对我们来说就是两个注解)
    Feign通讯(Http),同步,阻塞,负载均衡
    服务注册与发现:Eureka
    熔断机制:Hystrix
    
    3.SpringCloud+Alibaba:(一站式解决方案)
    
    4.服务网格Server Mush/istio

    常见面试题

    对于知识框架,要能够默写,才能进阶丶


    在线资源

    https://spring.io/projects/spring-cloud#learn(官网)

    https://www.springcloud.cc/spring-cloud-netflix.html(英文Api)

    https://www.springcloud.cc/spring-cloud-dalston.html (中文Api)

    http://springcloud.cn/(中文社区)

    https://www.springcloud.cc(中文网)


    案例实现

    父工程管理依赖

    <!--自动生成-->
    <modules>
        <module>springcloud-api</module>
        <module>springcloud-provider-dept-8001</module>
        <module>springcloud-consumer-dept-80</module>
    </modules>
    
    <!--打包方式pom-->
    <packaging>pom</packaging>
    
    <!--版本控制-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.13</junit.version>
        <lombok.version>1.18.12</lombok.version>
        <log4j.version>1.2.17</log4j.version>
    </properties>
    
    <!--依赖管理-->
    <dependencyManagement>
        <dependencies>
            <!--springcloud的依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR7</version>
                <type>pom</type>
                <scope>runtime</scope>
            </dependency>
            <!--springboot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.3.RELEASE</version>
                <type>pom</type>
                <scope>runtime</scope>
            </dependency>
            <!--数据库-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.21</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.23</version>
            </dependency>
            <!--springboot启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.3</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <build>
        <resources>
        </resources>
    </build>
    View Code

    实体工程仅仅管理实体,使生产者和消费者通过如下方式拿到实体类

    <!--拿到实体类-->
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>springcloud-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    生产者负责提供服务接口(访问数据库,业务逻辑处理)

    生产者接口以Restful的形式暴露

    //提供restful服务
    @RestController
    public class DeptController {
    
        @Autowired
        private DeptService deptService;
    
        @PostMapping("/dept/add")
        public boolean addDept(Dept dept){
            return deptService.addDept(dept);
        }
    
        @GetMapping("/dept/get/{id}")
        public Dept getDept(@PathVariable("id") Long id){
            return deptService.queryById(id);
        }
    
        @GetMapping("/dept/list")
        public List<Dept> getAll(){
            return deptService.queryAll();
        }
    }

    测试微服务 http://localhost:8001/dept/list

    消费者调用生产者提供的服务,便在80端口以restful方式暴露接口

    @Configuration//相当于spring的applicationContext.xml
    public class ConfigBean {
        @Bean
        public RestTemplate getTemplate(){
            return new RestTemplate();
        }
    }
    @RestController
    public class DeptConsumerController {
    
        //RestTemplate
        @Autowired
        private RestTemplate restTemplate;//提供多种便捷访问远程http服务的方法,简单的restful服务模板
    
        private static final String REST_URL_PREFIX = "http://localhost:8001";
    
        @RequestMapping("/consumer/dept/get/{id}")
        public Dept get(@PathVariable("id") Long id){
            return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
        }
    
        @RequestMapping("/consumer/dept/add")
        public boolean add(Dept dept){
            return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add/",dept,Boolean.class);
        }
    
        @RequestMapping("/consumer/dept/list")
        public List<Dept> list(){
            return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list/", List.class);
        }
    }

    测试微服务 http://localhost/consumer/dept/list


    https://github.com/ChenCurry/springcloud.git


    击石乃有火,不击元无烟!!
  • 相关阅读:
    python连接集群mongodb,封装增删改查
    selenium截屏操作(也支持截长图)
    ant生成jmeter测试报告没有数据【已解决】
    论自动化如何提高测试工作效率
    研究显示情商高的人比智商高的可怕多了
    提高程序员职场价值的10大技巧
    革命就是请客吃饭(案例分析吧)
    开发者应该了解的API技术清单!
    陈天:如何快速掌握一门技术
    程序员如何参与创业
  • 原文地址:https://www.cnblogs.com/rain2020/p/13507805.html
Copyright © 2011-2022 走看看