1、微服务架构
2、SpringCloud
springcloud是一系列微服务功能的结合体。采用了多种技术。
1、payment
环境搭建:
1、父工程创建:POM方式打包,dependiencesManagerment 与dependices区别。
2、子工程创建;
新建项目
改POM
写yml
写主运行类
写业务
- 建表
- entities
- dao
- service
- controller
测试
@Param注解的作用
用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中
我们先来看Mapper接口中的@Select方法
package Mapper;
@Mapper public interface Mapper { @Select("select s_id id,s_name name,class_id classid from student where s_name= #{aaaa} and class_id = #{bbbb}") public Student select(@Param("aaaa") String name,@Param("bbbb")int class_id); @Delete...... @Insert...... }
1、@Select(……)注解的作用就是告诉mybatis框架,执行括号内的sql语句
2、s_id id,s_name name,class_id classid 格式是 字段名+属性名,
例如s_id是数据库中的字段名,id是类中的属性名
这段代码的作用就是实现数据库字段名和实体类属性的一一映射,不然数据库不知道如何匹配
3、where s_name= #{aaaa} and class_id = #{bbbb} ,表示sql语句要接受2个参数,一个参数名是aaaa,一个参数名是bbbb;
如果要正确的传入参数,那么就要给参数命名,因为不用xml配置文件,那么我们就要用别的方式来给参数命名,这个方式就是@Param注解
4、在方法参数的前面写上@Param("参数名"),表示给参数命名,名称就是括号中的内容
public Student select(@Param("aaaa") String name,@Param("bbbb")int class_id);
给入参 String name 命名为aaaa,然后sql语句....where s_name= #{aaaa} 中就可以根据aaaa得到参数值了。
5、如果传入的参数是基本类型参数和实体类对象。
public List<student> selectuser(@Param(value = "page")int pn ,@Param(value = "st")student student); <select id="selectuser" resultType="com.user.entity.student"> SELECT * FROM student where sname like concat(concat("%",#{st.sname}),"%") LIMIT #{page} ,5 </select>
@Mapper与@Resposity
https://blog.csdn.net/Xu_JL1997/article/details/90934359
- @Mapper 一定要有,否则 Mybatis 找不到 mapper。
- @Repository 可有可无,可以消去依赖注入的报错信息。
- @MapperScan 可以替代 @Mapper。
@Resource 与@Autowried
https://blog.csdn.net/weixin_40423597/article/details/80643990
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Slf4j
声明:如果不想每次都写private final Logger logger = LoggerFactory.getLogger(当前类名.class); 可以用注解@Slf4j;
1.使用idea首先需要安装Lombok插件;
2.在pom文件加入lombok的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version><!--版本号自己选一个就行-->
</dependency>
3.类上面添加@Sl4j注解,然后使用log打印日志;
![](https://img2020.cnblogs.com/blog/1614406/202010/1614406-20201009175618174-1122805196.png)
@MapperScan():用于扫描mapper与componentscan不同。
Devtools:
自动热部署
服务注册中心:
Eureka:
Eureka使用流程:
1、idea生成eurekaServer端服务注册中心,类似物业公司。
2、eurekaClient端cloud-provider-payment8001将注册进eurekaServer成为服务提供者,类似尚硅谷对外提供授课服务。
3、eurekaClient 端cloud-consumer-order80将注册进eurekaServer成为服务消费者,类似尚硅谷上课消费的同学。
@EnableEurekaServer 用于表明当前模块为注册中心
https://blog.csdn.net/TP89757/article/details/100877037
spring-boot-starter-actuator(健康监控)配置和使用
在生产环境中,需要实时或定期监控服务的可用性。Spring Boot的actuator(健康监控)功能提供了很多监控所需的接口,可以对应用系统进行配置查看、相关功能统计等。
![](https://img2020.cnblogs.com/blog/1614406/202010/1614406-20201010220552390-172098648.png)
Eureka集群环境构建步骤:
1、参考cloud-eureka-server7001创建7002端口项目;
2、改pom
3、修改映射配置
4、写yml
5、主启动
service服务的集群:
1、取消consumer80服务写死的的地址。改为服务名称;
2、使用@LoadBalanced 注解赋予RestTemplate负载均衡的能力,默认轮询,加在restTemplate bean定义上。
Actuator微服务信息完善:
1、主机名,服务名修改。
2、访问信息有ip显示。
添加以下信息
instance: instance-id: payment8002 prefer-ip-address: true
服务发现Discovery:
通过discoveryClient获取发现信息
@GetMapping("/payment/discovery") public Object discovery(){ List<String> services = discoveryClient.getServices(); for(String service:services){ log.info("***service:"+service); } List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE"); for(ServiceInstance instance:instances){ log.info("instance: "+instance.getHost()+":"+instance.getPort()); } return discoveryClient; }
使用@EnableDiscoveryClient开启功能
保护模式:
禁止自我保护:
服务注册中心增加yml
eureka: server: #关闭默认保护机制 enable-self-preservation: false #2s后就关闭 eviction-interval-timer-in-ms: 2000
服务提供者添加:减少心跳发送间隔,减小eureka删除服务时间
eureka: instance: lease-renewal-interval-in-seconds: 1 lease-expiration-duration-in-seconds: 2
Zookeeper:
1、新建子模块
2、启动POM
3、YML
4、主启动类
5、Controller
6、启动8004注册进zookeeper(有jar包冲突时需排除)
7、验证zookeeper的service是否包含payment。
zookeeper注册中心是持久还是临时?
zookeeper的服务节点是临时的,心跳时间超出后删除服务。
Consul:
1、简介
2、安装运行
安装说明:官网learn.hashicorp.com
在cmd中启动。
使用开发模式启动: consul agent -dev.
3、将服务提供者注册进consul。
使用方式与zookeeper类似
4、将服务消费者注册进consul。
在使用springcloud客户端负载均衡的时候,可以给RestTemplate bean 加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能力:
三个注册中心异同点:
![](https://img2020.cnblogs.com/blog/1614406/202010/1614406-20201013151958611-1041938392.png)
Ribbon:
eureka包含了ribbon.
负载均衡策略:
新建配置类:
@Configuration public class MyselfRule { @Bean public IRule myRule(){ return new RandomRule();//随机选择 } }
该配置类不可放于能被ComponentScan扫描的地方。
主启动类添加
@RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration = MyselfRule.class)
Ribbon负载均衡算法.
手写负载均衡时要取消默认的loadbalance
https://blog.csdn.net/majinan3456/article/details/99352894
ribbon与nginx负载均衡有什么区别:
-
Nginx服务器端负载均衡:
nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡请求转发,属于服务器端负载均衡。
既请求有nginx服务器端进行转发。 -
Ribbon客户端负载均衡:
Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,让后在本地实现轮训负载均衡策略。
既在客户端实现负载均衡。 -
应用场景的区别:
Nginx适合于服务器端实现负载均衡 比如Tomcat ,Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,比如Dubbo、SpringCloud中都是采用本地负载均衡。
OpenFeign
超时:配置ribbon超时时间。ms
ribbon: ConnectTimeout: 5000 ReadTimeout: 5000
日志:
增加配置:
logging:
level:
#feign日志以什么级别监控哪些接口
com.springcloud.service.PaymentService: debug
注入bean
@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
Hystrix:
服务降级
通过jmeter添加压力测试:
正常方法开始卡顿
超时导致服务器变慢:转圈,超时不在等待。
出错:程序运行出错。
服务熔断:
服务网关:
zuul:
gateway:
特性:
/*进行全局请求参数过滤*/ @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("************进入全局过滤器"); String uname = exchange.getRequest().getQueryParams().getFirst("uname"); if(uname == null){ log.info("请求参数不对"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } return chain.filter(exchange); }
config
bootstrap.yml配置
配置文件修改后服务端响应较快,客户端响应较慢,重启后才能更新。
需要动态刷新:
1、添加
@RefreshScope//刷新功能
注解
2、发送 curl -X POST "http://localhost:3355/actuator/refresh"
BUS消息总线
stream
对不同的mq提供统一服务。
重复消费:
分组原理:
持久化:
一定要使用分组。