转载声明:文章来源: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/结果如下:
我的java个人心得,入门重要,但是大多 数人都搞错了方向: 第一.切记不要一上来就找一大本厚书看。 这样你绝对会放弃。《Java核心技术》 《Java编程思想》 等都不适合入门阅读,很容易半途而废。 第二.先找一个入门级别的java教程看。 网上有很多极简入门教程。 例如runoob网站、w3cschool网站(它还有手机app) (上网搜一下关键词就有了)。 我记得我一开始入门找的教程,知识面全而精炼简洁, 含有基础、spring、Hibernate Servlet 等,地址如下仅供参考。 How2J 的 Java教程 第三.当你学完刚才那些网站之后, 你应该此时对java有了一个整体的认识, 那就去找一个小项目,GitHub很棒, https://github.com/上手练习,边做项目边查资料。 进步会飞快。 第四.这个阶段再回头精读一些java经典书籍。 获得内功上的提升。总之,一定要循序渐进, 一点点学才是最正确的选择。个人愚见,仅供参考