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


击石乃有火,不击元无烟!!
原文地址:https://www.cnblogs.com/rain2020/p/13507805.html