本博客以深入理解Spring Cloud与实战[方剑/编著]一书进行学习和理解

如有侵权,请联系作者

  1. 什么是微服务?

    简单举例:看军事新闻的同学应该都知道,一艘航空母舰作战能力虽然很强,但是弱点太明显,就是防御能力太差,单艘的航空母舰很少单独行动,通常航空母舰战斗群才是主要军事力量,你可以把单艘航母理解为的单体应用(防御差,机动性不好),把航母战斗群(调度复杂,维护费用高)理解为微服务。

  2. 为什么需要微服务?

    我们先看看微服务能带给我们什么?微服务架构的特点:

    • 针对特定服务发布,影响小,风险小,成本低
    • 频繁发布版本,快速交付需求
    • 低成本扩容,弹性伸缩,适应云环境
  3. 怎么实现微服务?

在这里插入图片描述

由以下三部分组成

  • 注册中心

    注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。

    这里使用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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐