【校招VIP】SpringCloud--服务注册与服务发现

10月17日 收藏 0 评论 0 java开发

【校招VIP】SpringCloud--服务注册与服务发现

转载声明:文章来源:https://blog.csdn.net/qq_44962906/article/details/122474912

1.什么是微服务?

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

2.为什么需要微服务?

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

针对特定服务发布,影响小,风险小,成本低

频繁发布版本,快速交付需求

低成本扩容,弹性伸缩,适应云环境

3.怎么实现微服务?

由以下三部分组成

1.注册中心

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

这里使用Alibaba Nacos注册中心,Netflix Eureka已停止维护,不推荐使用

2.服务提供者

将服务注册到注册中心里

3.服务消费者

对注册中心里的服务进行调用

一、使用 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/结果如下:


C 0条回复 评论

帖子还没人回复快来抢沙发