本博客以深入理解Spring Cloud与实战[方剑/编著]一书进行学习和理解
如有侵权,请联系作者
目录
-
什么是微服务?
简单举例:看军事新闻的同学应该都知道,一艘航空母舰作战能力虽然很强,但是弱点太明显,就是防御能力太差,单艘的航空母舰很少单独行动,通常航空母舰战斗群才是主要军事力量,你可以把单艘航母理解为的单体应用(防御差,机动性不好),把航母战斗群(调度复杂,维护费用高)理解为微服务。
-
为什么需要微服务?
我们先看看微服务能带给我们什么?微服务架构的特点:
- 针对特定服务发布,影响小,风险小,成本低
- 频繁发布版本,快速交付需求
- 低成本扩容,弹性伸缩,适应云环境
-
怎么实现微服务?
由以下三部分组成
-
注册中心
注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。
这里使用Alibaba Nacos注册中心,Netflix Eureka已停止维护,不推荐使用
-
服务提供者
将服务注册到注册中心里
-
服务消费者
对注册中心里的服务进行调用
一、使用 Nacos Discovery Provider进行服务注册
新建spring boot项目,选择Lombok和Spring Web模块即可
依赖配置
<!-- 修改依赖, 将spring boot版本与spring cloud版本要对应 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
application.yml配置文件
spring:
application:
name: my-provider # 要注册的服务名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos Server地址信息
server:
port: 8080 # 应用要启动的端口,也是要注册的端口号
代码实现
@RestController
@RequestMapping("provider")
public class ProviderController {
@RequestMapping("echo") // 对外暴露的接口
public String echo(@RequestBody String parameter) { // parameter为需要接收的参数,不加@RequestBody会无法接收到参数
return "the provider receive parameter is " + parameter;
}
}
运行ProviderApplication即可
服务查看(登陆Naocs控制台进行查看)
二、使用Nacos Discovery Consumer进行服务发现
application.yml配置文件
spring:
application:
name: my-consumer # 要发现的服务名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos Server地址信息
server:
port: 8088 # 应用要启动的端口
1、使用RestTemplate
修改启动类并且增加一个注解
@SpringBootApplication
@EnableDiscoveryClient(autoRegister = false) // 表示开启服务发现功能,同时设置不自动注册到注册中心
public class SpringCloudConsumerApplication {
@Bean
@LoadBalanced //通过该注解就可以基于服务名进行服务调用
public RestTemplate restTemplate() { // 用于调用服务实例
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumerApplication.class, args);
}
}
实现
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
private String serviceName = "my-provider"; // 需要调用的服务名
@GetMapping("/hello")
public String hello(){
return restTemplate.getForObject( // 调用服务实例对应的节点信息
"http://" + serviceName + "/provider/echo",
String.class);
}
}
2、使用OpenFeign【推荐】
新建spring boot项目,选择Lombok和Spring Web模块即可
依赖配置
<!-- 在上文配置的基础上再增加以下配置即可 -->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
修改启动类
@SpringBootApplication
// OpenFeign注解,参数为增加的服务所在的包
@EnableFeignClients(basePackages = "edu.xzit.consumer.server")
// 设置不自动注册到注册中心,因为这是一个消费者
@EnableDiscoveryClient(autoRegister = false)
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
编写服务接口
// 参数为服务名
@FeignClient(name = "my-provider")
public interface ConsumerServer {
@RequestMapping("/provider/echo") // 这里的参数一定要写全,必须与provider中的访问地址一致
String echo(String parameter); // 参数为Provider需要的参数
}
写一个接口进行测试
@RestController
public class TestController {
@Autowired
private ConsumerServer consumerServer;
@RequestMapping("/test")
public String test() {
return consumerServer.echo("consumer");
}
}
Postman测试http://localhost:8088/test/结果如下:
引用博客地址,鸣谢
http://www.uml.org.cn/wfw/202004142.asp
https://www.cnblogs.com/xiao2shiqi/p/11298663.html