文章目录
第一部分:了解聚合工程
1.代表的业务
SpringBoot: 监控
Spring: 定义各种业务bean
mybatis: 持久化业务
2.微服务的含义
微服务项目一般都会采用聚合工程结构,可通过聚合工程结构实现共享资源的复用,简化项目的管理方式。
布局如下:
例如:
GitCGB2105IVProjects (工作区/空项目)
├── 01-sca //微服务父工程
├── sca-provider //服务提供方法
├── sca-consumer //服务消费方法
├── sca-gateway //网关服务
【先建一个maven的父级工作区,其中父级的src可以删除,pom可以复制老师的,也可以自己打】
【父工程的作用:将子工程的共性代码提取出来,打包的默认方式是pom】
【父工程的下所有子工程,都会默认以module元素的方式添加到父工程中】
【如若删除:首先进行file—>Project Structure—>Modules—>减号;然后project下找到目标右击delete; 最后删除父工程pom
中modules的数据】
3.注意的点
- springboot的@test导的包是:org.junit.jupiter.api
- …/startup.sh -m standalone 其中standalone代表着单机模式运行,非集群模式
- throwable 用于接收异常
- 把对象交给spring:不整合第三方时,可以用@Component; @Bean //非配置类用此方式导入【整合第三方】
例子如下:
@Bean
public DefaultCache defaultCache(){
return new DefaultCache();
}
@Import //配置类用此方式导入
- 一旦有@Component、 @Service:服务层、 @Controller:控制层、@Repository:持久层时,就要使用@Autowired:依赖注入.
第二部分Nocas注册平台
1.Nocas的含义
Nacos是一种应用于服务注册与发现、配置管理的平台【nacos说明白点就是注册中心和配置中心】
2.Nocas在不同系统的启动方式
startup.cmd -m standalone:windows方式启动nacos服务
【其中standalone是非集群方式运行,也叫单机访问】
./startup.sh -m standalone:Linux方式启动nacos服务
【其中standalone是非集群方式运行,也叫单机访问】
3.配置Nocas的步骤
(1)官网下载Nacos的压缩包
(2)然后解压Nacos的压缩包【别放在中文的目录下】
(3)登录mysql,并导入nacos-mysql.sql脚本
source d:/nacos-mysql.sql
(4)然后修改nacos中conf中的application.properties配置【改 Config Module Related Configurations下面的#删除】
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
(5)配置完成后,启动nacos的服务
(6)访问Nacos的服务即可【默认的密码和账号为nacos】
4.配置Nocas的注册中心步骤
(1)先定义服务的POM文件
<dependencies>
<!--Web服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务的注册和发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
(2)再定义application.yml文件【其中服务的名字之间只能用横线连接】
server:
port: 8081
spring:
application:
name: sca-provider #进行服务注册必须配置服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848
(3)再创建服务启动类
(4)最后启动Nacos服务
5.配置Nocas的调用步骤
(1)首先提供服务方的控制层创建对象
package com.jt.provider.controller;
/**定义Controller对象(这个对象在spring mvc中给他的定义是handler),
1. 基于此对象处理客户端的请求*/
@RestController
public class ProviderController{
//@Value默认读取项目配置文件中配置的内容
//8080为没有读到server.port的值时,给定的默认值
@Value("${server.port:8080}")
private String server;
//http://localhost:8081/provider/echo/tedu
@GetMapping("/provider/echo/{msg}")
public String doRestEcho1(@PathVariable String msg){
return server+" say hello "+msg;
}
}
(2)再创建消费方,并继承最外面的maven,并修改pom文件
<dependencies>
<!--Web服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务的注册和发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
(3)再添加并修改application.yml文件
server:
port: 8090
spring:
application:
name: sca-consumer #服务注册时,服务名必须配置
cloud:
nacos:
discovery:
server-addr: localhost:8848 #从哪里去查找服务
(4)创建消费方的启动类实现服务消费
(5)然后在消费方的启动类创建RestTemplate对象【RestTemplate:调用远程服务的】
@Bean
public RestTemplate restTemplate(){//基于此对象实现远端服务调用
return new RestTemplate();
}
(6)然后定义消费方的控制层,并在此方法中实现远程的调用
@RestController
public class ConsumerController {
/**
* 从spring容器获取一个RestTemplate对象,
* 基于此对象实现远端服务调用
*/
@Autowired
private RestTemplate restTemplate;
/**
* 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务
* @return
* 访问此方法的url: http://localhost:8090/consumer/doRestEcho1
*/
@GetMapping("/consumer/doRestEcho1")
public String doRestEcho01(){
//1.定义要调用的远端服务的url
String url="http://localhost:8081/provider/echo/8090";
//2.基于restTemplate对象中的相关方法进行服务调用
return restTemplate.getForObject(url, String.class);
}
}
(7)最后启动消费者服务和提供者服务,以及Nacos服务【缺一不可】
6.修改消费端默认的负载均衡策略
方法一:
#客户端负载均衡
sca-provider: #要访问的服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡算法
方法二:
定义一个IRule类在消费方的启动类中
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
7.Netflix默认提供了负载均衡策略(只记了几个常用的)
(1)RoundRobinRule:轮训策略【默认】
(2)RandomRule:随机策略
(3)RetryRule:重试策略
(4)ZoneAvoidanceRule:加权策略
8.配置负载均衡的远程调用:【Ribbon】
(1)首先提供服务方的控制层创建对象
(2)再创建消费方,并继承最外面的maven,并修改pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
(3)再添加并修改application.yml文件
server:
port: 8090
spring:
application:
name: sca-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#客户端负载均衡
sca-provider: #要访问的服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡算法
(4)创建消费方的启动类实现服务消费
(5)然后在消费方的启动类创建RestTemplate对象
(6)然后通过@LoadBalanced定义一个RestTemplate对象交给Spring管理
【/LoadBalancerClient:微服务端的负载均衡的客户端对象/】
(7)然后注入创建好的对象,并创建个方法
(8)最后启用即可
【最后两步,例子如下:
public String doReEch03(){
String serverName="sca-provider";
String url=String.format("http://%s/provider/echo/{msg}", serverName);
return loadBalancedRestTemplate.getForObject(url, String.class,appName);
}
】
9.Feign应用实践配置:【在负载均衡配置基础上】
(1)在服务消费方导入项目依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)在消费方的启动类加注解@EnableFeignClients------【该注解是用来启用Feign客户端】
@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {…}
(3)然后在消费方用@FeignClient定义接口来IP地址访问远程服务-----【@FeignClient描述的接口底层会为其创建实现类】
package com.jt.consumer.service;
@FeignClient(name="sca-provider")//sca-provider为服务提供者名称
public interface RemoteProviderService{
@GetMapping("/provider/echo/{string}")//前提是远端需要有这个服务
public String echoMessage(@PathVariable("string") String string);
}
【在Feign接口中从路径获取参数时,@PathVairaible(“路径的参数”) 参数类型 参数】
(4)然后再定义相对应的collection层和YML文件
package com.jt.consumer.controller;
@RestController
@RequestMapping("/consumer/ ")
public class FeignConsumerController {
@Autowired
private RemoteProviderService remoteProviderService;
/**基于feign方式的服务调用*/
@GetMapping("/echo/{msg}")
public String doFeignEcho(@PathVariable String msg){
//基于feign方式进行远端服务调用(前提是服务必须存在)
return remoteProviderService.echoMessage(msg);
}
}
【YML文件的配置信息为feign.hystrix.enabled: true】#熔断机制,连接超时自动熔断
(5)最后启动消费者服务
注意的点
- idea中Http Client工具的应用(基于此工具进行restful风格的请求测试)
(1)Tools----->Http Client------>Test RESTful Web Service
(2)输入请求类型 要访问的地址【每个请求完了都以###分隔】 - RPC:跨进程服务
- Nacos是springboot的程序
- idea中链接数据库的URL中后面加的serverTimezone=Asia/Shanghai&characterEncoding=utf8
- String类的format()方法用于创建格式化的字符串以及连接多个字符串对象【%s:占位符】
- Feign接口指向的对象是代理对象
- @EnableFeignClients注解的作用:描述配置类
- @FeignClients注解的作用:在启动类启动时,描述的接口创建实现类-代理类
- 常用服务发现、服务调用方式有:RestTemplate、Ribbon、feign
(1)sca-consumer------>RestTemplate直接获取实例------>sca-provider
(2)先通过LoadBalancerClient进行服务查找,然后通过ServiceInstance获取服务实例,最后通过RestTemplate调用
(3)@LoadBalanced+RestTemplate
(4)@EnableFeignClients+@FeignClient - Ribbon:是负载均衡客户端,一般应用于服务的消费方法
Ribbon:可以解决基于负载均衡策略进行服务调用的问题
@LoadBalanced的作用是:描述RestTemplate对象,让系统底层为RestTemplate对象赋能,对象请求过程进行拦截 - idea中Http Client工具的应用(基于此工具进行restful风格的请求测试)
(1)Tools----->Http Client------>Test RESTful Web Service
(2)输入请求类型 要访问的地址【每个请求完了都以###分隔】 - 【主要YML配置:超时连接:
feign:
client:
config:
default: #表示所有的服务均采用此配置。也可以指定具体的服务名
connectTimeOut: 10000 #连接超时
readTimeout: 10000 #读取数据超时】
【注意:配置了熔断机制就不能配置连接超时和读取数据超时;两者只能存在一个】
13. 不同的报错信息:
客户端报500,证明后端服务器报错
客户端报404,证明路径错误,访问不到
客户端报405,证明请求参数不匹配
客户端报400,证明参数类型不对
客户端报502,证明连接超时
客户端报403,证明权限不存在
客户端报503,证明服务不可用
客户端报401,证明没有认证不够