Spring Boot微服务之入门

标签: Springboot 分类: Java 创建时间:2020-01-09 08:04:20 更新时间:2024-11-15 10:49:43

1.微服务的相关介绍

优点:
(1) 它解决了复杂性问题。它将单体应用分解为一组服务。
(2) 这种体系结构使得每个服务都可以由专注于此服务的团队独立开发。
(3) 微服务架构可以使每个微服务独立部署。
(4) 微服务架构使得每个服务都可独立扩展。

缺点:
(1) 微服务强调了服务大小,但实际上这并没有一个统一的标准。业务逻辑应该按照什么规则划分为微服务,这本身就是一个经验工程。
(2) 微服务的另一个主要缺点是微服务的分布式特点带来的复杂性。
(3) 微服务的另一个挑战是分区的数据库体系和分布式事务。
(4) 微服务架构对测试也带来了很大的挑战。
(5) 微服务的另一大挑战是跨多个服务的更改。
(6) 部署基于微服务的应用也要复杂得多。

基础设施:

  • 服务治理
  • 配置管理中心
  • 网关
  • 服务容错
  • 服务消费者
  • 消息中间件
  • 分布式服务追踪
  • 安全
  • 微服务测试

2.使用springboot cloud alibaba

下载Nacos,运行Nacos。

3.新建maven程序

新建一个空的maven程序,编写pom.xml,其中bigdata,是我模块的名字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.bibichuan</groupId>
<artifactId>SpringBootCould</artifactId>
<version>1.0-SNAPSHOT</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/>
</parent>

<modules>
<module>bigdata</module>
</modules>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>

4.新建两个子模块

(1) 新建模块这里,其实和新建springboot应用程序差不多,只不过在选择Module。模块的pom中,添加父类的pom引用

1
2
3
4
5
6
<parent>
<groupId>com.bibichuan</groupId>
<artifactId>SpringBootCould</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../</relativePath> <!-- lookup parent from repository -->
</parent>

(2) 修改模块的application.propreties文件,添加配置服务名称和nacos注册地址

1
2
3
4
5
6
7
spring:
application:
name: phemsjava
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848

(3) 主类上添加@EnableDiscoveryClient注解

5.调用服务

新建了两个子模块之后,使用上面的方法配置服务发现,配置application.yml之后,在需要调用服务的地方编写下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/helloworld")
public String test(String name) {
// 通过spring cloud common中的负载均衡接口选取服务提供节点实现接口调用
// serviceId为spring.application.name
ServiceInstance serviceInstance = loadBalancerClient.choose("phemsjava");
System.out.println(serviceInstance.getUri());
String url = serviceInstance.getUri() + "/getAll";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(url, String.class);
return "from: " + url + ",return: " + result;
}
参考文章:
1.[踩坑] Nacos服务注册地址为内网IP的解决办法
2.spring cloud微服务之间的调用 主要讲了RestTemplate方式调用微服务的三种方式,包括了使用 LoadBalancerClient 注解的方式进行。
3.Client-Side Load-Balancing with Spring Cloud LoadBalancer 官方的使用 Load-Balancing 进行服务调用的例子。
4.SpringCloud LoadBalancerClient实现负载均衡以及自定义负载策略(一个或多个) 本章主要来具体实现怎样使用LoadBalancerClient实现负载均衡。springcloud提供的组件Ribbon,内部就是集成了LoadBalancerClient负载均衡,通过@LoadBalance注解开启负载均衡器。

6.微服务和分布式的区别

微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。微服务的设计是为了不因为某个模块的升级和BUG影响现有的系统业务。微服务与分布式的细微差别是,微服务的应用不一定是分散在多个服务器上,他也可以是同一个服务器。

问题

(1) Field loadBalancerClient in com.proheng.phzsjm.task.AlarmTask required a bean of type ‘org.springframework.cloud.client.loadbalancer.LoadBalancerClient’ that could not be found。Consider defining a bean of type ‘org.springframework.cloud.client.loadbalancer.LoadBalancerClient’ in your configuration。

这里显示就是LoadBalancedClient无法注入的问题,
【尝试】
我尝试了很多的方法:
1.排除了若依系统自带的一些依赖包
2.重启了idea
3.修改了模块中父pom.xml的依赖,指向了 spring-boot-starter-parent,结果出现了 java.lang.NoClassDefFoundError: org/springframework/boot/Bootstrapper

【解决】
经过无数次的尝试,最后我竟然发现,不断的对比关于pom.xml的配置,我竟然发现,我少了一个依赖没有添加 SpringCloud Loadbalancer,真是见了鬼了,因为我在另外的一个工程中,并没有引入这个依赖啊。

1
2
3
4
5
<!-- SpringCloud Loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

但是很多的地方都没有提到过也加入这个依赖,只是说要添加 spring-boot-starter-web 这个依赖,这我就比较多难过了,难道是因为我引入的方式不对吗?

参考文章:
1.cannot find DiscoveryClient bean error in spring boot
2.SpringCloud学习笔记———-LoadBalancedClient无法注入的问题 这里说的是检查有没有 eureka注入spring-cloud-starter-netflix-eureka-client
3.spring cloud默认的LoadBalancerClient是RibbonLoadBalancerClient
4. 微服务Nacos\LoadBalancerClient\R-爱代码爱编程 这个没看,感觉写的有点乱,这里还讲了 基于Feign的远程服务调用。
5.di注入LoadBalancerClient类实现负载均衡,借助@LoadBalanced注解实现RestTemplate的负载均衡 这里也没有提到过要添加Spring-cloud-loadbalancer依赖啊,这是怎么回事?
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。