Download: Spring Cloud / Alibaba 微服务架构实战 | 网盘下载
Spring Cloud / Alibaba 微服务架构实战 - 微服务架构
软件架构是一个包含各种组织的系统组织,这些组件包括 Web服务器, 应用服务器, 数据库,存储, 通讯层), 它们彼此或和环境存在关系。系统架构的目标是解决利益相关者的关注点
链接: https://pan.baidu.com/s/1Qq3FAqzkmakso2E7KuxvVg 提取码: kczq
作者-\/ 307570512
微服务优点 每个微服务都很小,这样能聚焦一个指定的业务功能或业务需求。 微服务能够被小团队单独开发,这个小团队是2到5人的开发人员组成。 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。 微服务能使用不同的语言开发。 微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins, bamboo 。 一个团队的新成员能够更快投入生产。 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。 微服务允许你利用融合最新技术。 微服务只是业务逻辑的代码,不会和HTML,CSS 或其他界面组件混合。 微服务能够即时被要求扩展。 微服务能部署中低端配置的服务器上。 易于和第三方集成。 每个微服务都有自己的存储能力,可以有自己的数据库。也可以有统一数据库。
微服务架构的缺点 微服务架构可能带来过多的操作。 需要DevOps技巧 (en.wikipedia.org/wiki/DevOps). 可能双倍的努力。 分布式系统可能复杂难以管理。 因为分布部署跟踪问题难。 当服务数量增加,管理复杂性增加。
Spring Cloud / Alibaba 微服务架构实战 - 微服务架构设计原则
AKF拆分原则 前后端分离 无状态服务 Restful通信风格
Spring Cloud / Alibaba 微服务架构实战 - Nacos服务注册与配置中心
Nacos用来做服务注册中心以及配置中心,相当于Spring Cloud的Eureka(已停止维护)或者Zookeeper(没有控制台,不方便查阅注册服务)抑或Consul(某种原因,不建议使用)服务注册中心,以及Spring Cloud Confi或携程开源的Apollo配置中心二者的结合版。
- 创建一个maven父工程,引入spring-cloud以及spring-cloud-alibaba版本依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<!-- nacos注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
<!-- 依赖版本号管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 创建modules子工程
@SpringBootApplication
public class NacosApplication {
public static void main(String[] args) {
SpringApplication.run(NacosApplication.class, args);
}
}
Spring Cloud / Alibaba 微服务架构实战 - 微服务通信
maven地址:
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
一般注册中心都自带
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 向Spring容器中定义RestTemplate对象
* @return
*/
@Bean
@LoadBalanced #此注解一定要有,要不然找不到服务
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
}
服务调用
public Item queryItemById(Long id) {
//该方法走注册中心调用
//去注册中心根据app-item查找服务,这种方式必须先开启负载均衡@LoadBalanced
String itemUrl = "http://app-item/item/{id}";
Item result = restTemplate.getForObject(itemUrl, Item.class, id);
System.out.println("订单系统调用商品服务,result:" + result);
return result;
}
OpenFeign
package com.hao.springcloud.cloudconsumerorder8002.service;
#注意这个目录地址,就是上边EnableFeignClients指定的目录
import com.hao.cloudapicommons.bean.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Service
@FeignClient("cloud-payment-service")//被调用的服务名
public interface PaymentService {
//接口必须和被调用的接口地址、参数、返回类型都保持一致
@GetMapping("/getPayMent/{id}")
public Payment getPayMent(@PathVariable("id") long id);
}