当前位置:   article > 正文

SpringCloud微服务(一)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式一(RestTemplate、Eureka、Ribbon、Nacos、Feign)_spring cloud微服务 redis

spring cloud微服务 redis

目录

一、什么是微服务

单体架构

 分布式架构

微服务结构

服务拆分注意事项 

微服务远程调用

 1、步骤一:注册RestTemplate

2、步骤2:服务远程调用RestTemplat

​编辑提供者和消费者

思考:服务A调用了服务B,服务B调用了服务C,那么服务B是什么角色

答:一个服务既可以是提供者也可以是消费者,提供者和消费者是相对的,一个服务可以同时服务提供者和服务消费者

Eureka注册中心

思考:1、消费者如何获取服务提供者具体信息

(1)服务者提供者启动时向eureka注册自己的信息

(2)eureka保存这些信息

(3)消费者提供服务名称向eureka拉去提供者信息

 2、如果有多个服务提供者,消费者该如何选择?

服务消费者利用负载均衡算法,从服务列表中挑选一个

3、消费者如何感知服务提供者健康状态?

(1)服务提供者会没个30秒向EurekServer发送心跳请求,报告健康状态

(2)eureka会更新记录服务列表信息,心跳不正常会被剔除

(3)消费者 就可以拉去最新的信息

 动手实践

1、搭建eureka注册中心

(1)创建项目引入依赖

(2)编写启动类,添加@EnableEurkaServer注解

(3)添加application.yml文件,编写下面的配置

2、服务注册

注册user-service 

(1)导入依赖

(2)编写配置

实例部署​编辑

 在Order-Service完成服务拉取

(1)服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡

(2)再order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡

 Ribbon负载均衡

负载均衡原理

负载均衡策略

懒加载

饥饿加载 

 Nacos

服务注册到Nacos

1、再cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖

2、注释掉order-service和user-service中原有的eureka依赖

3、添加nacos的客户端依赖

4、修改客户端中的application.yml文件,注释eurka地址,添加nacos地址

5、启动并测试​编辑

 注意:必须启动nacos,账号密码都为nacos

Nacos服务分级存储模型 

 1、修改application.yml,添加如下内容

如何HZ改为SH再运行另外一个application

2、在Nacos控制台可以看到集群变化

 根据集群负载均衡

1、修改order-service中的application.yml,设置集群为HZ:

2、然后再order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务

3、注意将user-service的权重都设置为1

 根据权重负载均衡

环境隔离

 Nacos配置隔离

统一配置管理

 1、引入Nacos的配置管理依赖

2、再uservice的resoure目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml

管理配置热更新(自动刷新)

多环境配置共享

 Nacos集群搭建

Feign 

 使用Frign的步骤如下:

1、引入依赖:

2、在order-service的启动类添加注解开启Feign的功能

3、编写Feign客户端

主要是基于SpringMVC的注解来声明远程调用的信息,比如:

服务名称:userservice

请求方式:GET

请求路径:/user/{id}

请求参数:Long id

返回值类型:User

 自定义Fign配置

Feign性能优化

1、引入依赖

2、配置连接池: 

注意:日志尽量使用BASIC 

Frign的最佳实践

最佳实践 方式二:


一、什么是微服务

 

 

 

单体架构

 分布式架构

 

微服务结构

 

 

 

服务拆分注意事项 

微服务远程调用

 1、步骤一:注册RestTemplate

  1. @MapperScan("cn.itcast.order.mapper")
  2. @SpringBootApplication
  3. public class OrderApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(OrderApplication.class, args);
  6. }
  7. /**
  8. * 创建RestTemplate并注入Spring容器
  9. * @return
  10. */
  11. @Bean
  12. public RestTemplate restTemplate(){
  13. return new RestTemplate();
  14. }
  15. }

2、步骤2:服务远程调用RestTemplat

  1. @Service
  2. public class OrderService {
  3. @Autowired
  4. private OrderMapper orderMapper;
  5. @Autowired
  6. private RestTemplate restTemplate;
  7. public Order queryOrderById(Long orderId) {
  8. // 1.查询订单
  9. Order order = orderMapper.findById(orderId);
  10. //2.利用RestTemplate发起http请求,查询用户
  11. //2.1url路劲
  12. String url = "http://localhost:9101/user/"+order.getUserId();
  13. //2.2 发起http请求,实现远程调用0
  14. User user = restTemplate.getForObject(url, User.class);
  15. //3 封装user到Order
  16. order.setUser(user);
  17. //4.返回
  18. return order;
  19. }
  20. }

提供者和消费者

思考:服务A调用了服务B,服务B调用了服务C,那么服务B是什么角色

答:一个服务既可以是提供者也可以是消费者,提供者和消费者是相对的,一个服务可以同时服务提供者和服务消费者

Eureka注册中心

思考:1、消费者如何获取服务提供者具体信息

(1)服务者提供者启动时向eureka注册自己的信息

(2)eureka保存这些信息

(3)消费者提供服务名称向eureka拉去提供者信息

 2、如果有多个服务提供者,消费者该如何选择?

服务消费者利用负载均衡算法,从服务列表中挑选一个

3、消费者如何感知服务提供者健康状态?

(1)服务提供者会没个30秒向EurekServer发送心跳请求,报告健康状态

(2)eureka会更新记录服务列表信息,心跳不正常会被剔除

(3)消费者 就可以拉去最新的信息

 动手实践

1、搭建eureka注册中心

(1)创建项目引入依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  5. <version>2.1.2.RELEASE</version>
  6. </dependency>
  7. </dependencies>

(2)编写启动类,添加@EnableEurkaServer注解

(3)添加application.yml文件,编写下面的配置

  1. server:
  2. port: 10086 #服务端口
  3. spring:
  4. application:
  5. name: eurekaserver #eurka的服务名称
  6. eureka:
  7. client:
  8. service-url: #eurka的地址信息
  9. defaultZone: http://127.0.0.1:10086/eureka/

2、服务注册

注册user-service 

(1)导入依赖

  1. <!-- eureka客户端依赖-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  5. <version>2.1.2.RELEASE</version>
  6. </dependency>

(2)编写配置

  1. server:
  2. port: 9101
  3. spring:
  4. datasource:
  5. url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
  6. username: root
  7. password: 20202024
  8. driver-class-name: com.mysql.jdbc.Driver
  9. application:
  10. name: userservice #user的服务名称
  11. mybatis:
  12. type-aliases-package: cn.itcast.user.pojo
  13. configuration:
  14. map-underscore-to-camel-case: true
  15. logging:
  16. level:
  17. cn.itcast: debug
  18. pattern:
  19. dateformat: MM-dd HH:mm:ss:SSS
  20. eureka:
  21. client:
  22. service-url: #eurka的地址信息
  23. defaultZone: http://127.0.0.1:10086/eureka/

实例部署

 

 

 在Order-Service完成服务拉取

(1)服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡

        String url = "http://userservice/user/"+order.getUserId();

(2)再order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡

  1. @MapperScan("cn.itcast.order.mapper")
  2. @SpringBootApplication
  3. public class OrderApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(OrderApplication.class, args);
  6. }
  7. /**
  8. * 创建RestTemplate并注入Spring容器
  9. * @return
  10. */
  11. @Bean
  12. @LoadBalanced
  13. public RestTemplate restTemplate(){
  14. return new RestTemplate();
  15. }
  16. }

 Ribbon负载均衡

负载均衡原理

负载均衡策略

 

 

懒加载

饥饿加载 

 Nacos

服务注册到Nacos

1、再cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖

  1. <!--nacos的管理依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  5. <version>2.2.5.RELEASE</version>
  6. <type>pom</type>
  7. <scope>import</scope>
  8. </dependency>

2、注释掉order-service和user-service中原有的eureka依赖

3、添加nacos的客户端依赖

  1. <!-- nacos客户端依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

4、修改客户端中的application.yml文件,注释eurka地址,添加nacos地址

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
  4. username: root
  5. password: 20202024
  6. driver-class-name: com.mysql.jdbc.Driver
  7. application:
  8. name: userservice #user的服务名称
  9. cloud:
  10. nacos:
  11. server-addr: localhost:8848 #nacos服务地址

5、启动并测试

 注意:必须启动nacos,账号密码都为nacos

Nacos服务分级存储模型 

 

 1、修改application.yml,添加如下内容

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
  4. username: root
  5. password: 20202024
  6. driver-class-name: com.mysql.jdbc.Driver
  7. application:
  8. name: userservice #user的服务名称
  9. cloud:
  10. nacos:
  11. server-addr: localhost:8848 #nacos服务地址
  12. discovery:
  13. cluster-name: HZ #集群名,这里HZ代指杭州

如何HZ改为SH再运行另外一个application

2、在Nacos控制台可以看到集群变化

 

 

 根据集群负载均衡

1、修改order-service中的application.yml,设置集群为HZ:

  1. datasource:
  2. url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
  3. username: root
  4. password: 20202024
  5. driver-class-name: com.mysql.jdbc.Driver
  6. application:
  7. name: orderservice #order的服务名称
  8. cloud:
  9. nacos:
  10. server-addr: localhost:8848 #nacos服务地址
  11. discovery:
  12. cluster-name: HZ #集群名称

2、然后再order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务

  1. userservice: #要做配置的微服务名称
  2. ribbon:
  3. NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则

3、注意将user-service的权重都设置为1

 根据权重负载均衡

环境隔离

 

 

 

 

nacos注册中心原理

 

 

 Nacos配置隔离

统一配置管理

 ​​​​​​

 1、引入Nacos的配置管理依赖

  1. <!-- nacos的配置管理依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  5. </dependency>

2、再uservice的resoure目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml

  1. spring:
  2. application:
  3. name: userservice
  4. profiles:
  5. active: dev #环境
  6. cloud:
  7. nacos:
  8. server-addr: localhost:8848 #nacos地址
  9. config:
  10. file-extension: yaml #文件后缀名

  1. @Slf4j
  2. @RestController
  3. @RequestMapping("/user")
  4. public class UserController {
  5. @Autowired
  6. private UserService userService;
  7. @Value("${pattern.dateformat}")
  8. private String dateformat;
  9. @GetMapping("now")
  10. public String now(){
  11. return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
  12. }
  13. }

管理配置热更新(自动刷新)

  1. @Data
  2. @Component
  3. @ConfigurationProperties(prefix = "pattern")
  4. public class PatternProperties {
  5. private String dateformat;
  6. }

  1. @Slf4j
  2. @RestController
  3. @RequestMapping("/user")
  4. //@RefreshScope
  5. public class UserController {
  6. @Autowired
  7. private UserService userService;
  8. @Autowired
  9. private PatternProperties properties;
  10. @GetMapping("now")
  11. public String now(){
  12. return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
  13. }
  14. }

多环境配置共享

 

 

 Nacos集群搭建

Feign 

 

 使用Frign的步骤如下:

1、引入依赖:

  1. <!-- feign客户端依赖-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. </dependency>

2、在order-service的启动类添加注解开启Feign的功能

3、编写Feign客户端

  1. @FeignClient("userservice")
  2. public interface UserClient {
  3. @GetMapping("/user/{id}")
  4. User findById(@PathVariable("id") Long id);
  5. }
  1. @Service
  2. public class OrderService {
  3. @Autowired
  4. private OrderMapper orderMapper;
  5. @Autowired
  6. private UserClient userClient;
  7. public Order queryOrderById(Long orderId) {
  8. // 1.查询订单
  9. Order order = orderMapper.findById(orderId);
  10. //2.用Feign远程调用
  11. User user = userClient.findById(order.getUserId());
  12. // 3 封装user到Order
  13. order.setUser(user);
  14. //4.返回
  15. return order;
  16. }

主要是基于SpringMVC的注解来声明远程调用的信息,比如:

服务名称:userservice

请求方式:GET

请求路径:/user/{id}

请求参数:Long id

返回值类型:User

 自定义Fign配置

 

 

 

Feign性能优化

1、引入依赖

  1. <!-- 引入HttpClient依赖 得加入版本才行-->
  2. <dependency>
  3. <groupId>io.github.openfeign</groupId>
  4. <artifactId>feign-httpclient</artifactId>
  5. <version>12.3</version>
  6. </dependency>

2、配置连接池: 

  1. feign:
  2. client:
  3. config:
  4. default: #default全局的配置
  5. loggerLevel: BASIC #日志级别,BASIC就是基本的请求和响应信息
  6. httpclient:
  7. enabled: true #支持HttpClient的开关
  8. max-connections: 200 #最大连接数
  9. max-connections-per-route: 50 #单个路劲的最大连接数

注意:日志尽量使用BASIC 

Frign的最佳实践

 

 

最佳实践 方式二:

1、创建新模板,命名为feign-api

 

 创建模板后直接删除

feign-api引入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

order-service引入依赖

  1. <!-- 引入feign的统一api groupID自己创建项目的时候有的可以查看-->
  2. <dependency>
  3. <groupId>cn.itcast.demo</groupId>
  4. <artifactId>feign-api</artifactId>
  5. <version>1.0</version>
  6. </dependency>
  7. 这样子才可以导入其他包

  1. @MapperScan("cn.itcast.order.mapper")
  2. @SpringBootApplication
  3. @EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
  4. public class OrderApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(OrderApplication.class, args);
  7. }
  8. /**
  9. * 创建RestTemplate并注入Spring容器
  10. * @return
  11. */
  12. @Bean
  13. @LoadBalanced
  14. public RestTemplate restTemplate(){
  15. return new RestTemplate();
  16. }
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/551812
推荐阅读
相关标签
  

闽ICP备14008679号