背景
微服务
原文 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(中文网)
案例实现
父工程管理依赖
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!--自动生成--> <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>
实体工程仅仅管理实体,使生产者和消费者通过如下方式拿到实体类
<!--拿到实体类--> <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