• spring cloud笔记2


    简介

    项目运用

    1、由于多个服务项目在一起,所以需要一个主项目

    idea 先创建个Empty Project

    2、创建eureka-server文件项目

     选择Spring Cloud Discovery -> Eureka Server

    pom.xml 新增

    <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

    3、再创建一个提供者provider-ticket项目

    选择Spring Cloud Discovery -> Eureka Discovery Client

     

     4、创建消费者consumer-user项目

    选择Spring Cloud Discovery -> Eureka Discovery Client

     

     

    5、配置eureka-service服务

    创建application.yml

    server:
      port: 8761
    eureka:
      instance:
        hostname: eureka-server  #eureka实例的主机名
    
      client:
        register-with-eureka: false #不把自己注册到eureka上
        fetch-registry: false  #不从eureka上获取服务的注册信息
        service-url:
          defaultZone: http://localhost:8761/eureka/

    6、开启EnableEurekaServer,并启动项目

     1 /**
     2  * 注册中心
     3  * 1、配置Eureka配置
     4  * 2、@EnableEurekaServer
     5  */
     6 @EnableEurekaServer
     7 @SpringBootApplication
     8 public class EurekaServerApplication
     9 {
    10 
    11     public static void main(String[] args)
    12     {
    13         SpringApplication.run(EurekaServerApplication.class, args);
    14     }
    15 }

    7、输入http://localhost:8761/

    如果出现以下页面说明配置安装成功。

    8、服务注册

    provider-ticket项目中添加Service和Controller

     1 @Service
     2 public class TicketService
     3 {
     4     public String getTicket()
     5     {
     6         return "MyTicket";
     7     }
     8 }
     9 
    10 @RestController
    11 public class TicketController
    12 {
    13     @Autowired
    14     private TicketService ticketService;
    15 
    16     @GetMapping("ticket")
    17     public String getTicket()
    18     {
    19         return ticketService.getTicket();
    20     }
    21 }

    创建application.yml并配置

    server:
      port: 8001
    spring:
      application:
        name: provider-ticket
    
    eureka:
      instance:
        prefer-ip-address: true #注册服务的时候使用服务的ip地址
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/

    启动项目

    浏览器输入:http://localhost:8001/ticket

     刷新Eureka界面

    发现DESKTOP-2OL88N3:provider-ticket:8001已经注册进入,Application的Name就是yml注册的spring:application:name

    9、注册多个服务

     多个服务,再创建个服务项目,为了方便演示,就直接用现有的provider-ticket直接替换下端口号,其他不变,也为了方便测试,不创建新的项目,以jar包方式进行测试4444;

    (1) 将已创建好的provider-ticket 用maven package打包成jar包

     找到打包后的jar文件,然后在随便哪里创建个新的文件夹,并放入。为了方便我在桌面上创建了eureka文件夹,并将jar放入,为了方便名称修改后缀再加上端口号

    然后在provider-ticket中修改端口号,再重新package打包,并放入enreka文件夹

     

     然后cmd 命令运行8001和8002

     

     打开eureka页面,将会看到8001和8002已注册成功

    10、发现&消费

    consumer-user项目创建controller

    1 @RestController
    2 public class UserController
    3 {
    4     @GetMapping("buy")
    5     public String buyTicket(String name)
    6     {
    7         return name+"购买了";
    8     }
    9 }

    application.yml配置

    spring:
      application:
        name: conusmer-user
    server:
      port: 8200
    
    eureka:
      instance:
        prefer-ip-address: true #注册服务的时候使用服务的ip地址
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/

    开启发现服务功能,并将RestTemplate注入容器生效

     1 @EnableDiscoveryClient //开启发现服务功能
     2 @SpringBootApplication
     3 public class ConsumerUserApplication
     4 {
     5 
     6     public static void main(String[] args)
     7     {
     8         SpringApplication.run(ConsumerUserApplication.class, args);
     9     }
    10 
    11     @LoadBalanced //使用负载均衡机制
    12     @Bean
    13     public RestTemplate  restTemplate(){
    14         return  new RestTemplate();
    15     }
    16 }

    controller中加入RestTemplate进行调用

     1 @RestController
     2 public class UserController
     3 {
     4     @Autowired
     5     private RestTemplate restTemplate;
     6 
     7     @GetMapping("buy")
     8     public String buyTicket(String name)
     9     {
    10         String s = restTemplate.getForObject("http://PROVIDER-TICKET/ticket", String.class);
    11         return name + "购买了" + s;
    12     }
    13 }

     启动consumer-user项目

    打开eureka页面,会有CONUSMER-USER 注册成功

    访问8200,http://localhost:8200/buy?name=张三

     由于使用了负载均衡,我开启了2个8001和8002服务器,负载均衡会根据算法自动调用哪一台服务执行。

    Fegin来替换RestTemplate,为啥要用Fegin,细节自己看,不必详说,就是封装成接口形式调用,复用。

    1、新建consumer-user-fegin项目

    说明Fegin是客户端的

     创建完项目后,再新建application.yml 文件,配置跟consumer-user一模一样,为了区分,端口号可不一样

     1 server:
     2   port: 2023
     3 
     4 spring:
     5   application:
     6     name: conusmer-user
     7 eureka:
     8   instance:
     9     prefer-ip-address: true #注册服务的时候使用服务的ip地址
    10     instance-id: conusmer-user-fegin-id
    11   client:
    12     service-url:
    13       defaultZone: http://localhost:2100/eureka/

    项目的controller 也一样,先复制过来。

    在pom.xml 添加feign jar包

    1 <dependency>
    2     <groupId>org.springframework.cloud</groupId>
    3     <artifactId>spring-cloud-starter-feign</artifactId>
    4     <version>1.4.1.RELEASE</version>
    5 </dependency>

    在Controller 中,原先consumer-user项目调用了RestTemplate,我们现在替换Feign

    (1) 创建一个接口

    1 public interface TicketServiceFeign
    2 {
    3     String getTicket();
    4 }

    (2)添加注解@FeignClient,并指定指为PROVIDER-TICKET

    1 @FeignClient(value = "PROVIDER-TICKET")
    2 public interface TicketServiceFeign
    3 {
    4     String getTicket();
    5 }

    (3)  接口方法中添加RequestMapping信息

    1 @FeignClient(value = "PROVIDER-TICKET")
    2 public interface TicketServiceFeign
    3 {
    4     @GetMapping("ticket")
    5     String getTicket();
    6 }

    (4) 开启Feign  -> @EnableFeignClients

     1 @SpringBootApplication
     2 @EnableDiscoveryClient
     3 @EnableFeignClients
     4 public class ConsumerUserFeginApplication
     5 {
     6     public static void main(String[] args)
     7     {
     8         SpringApplication.run(ConsumerUserFeginApplication.class, args);
     9     }
    10 
    11 }

    (5) 编写controller

     1 @RestController
     2 public class UserController
     3 {
     4     @Autowired
     5     private TicketServiceFeign ticketServiceFeign;
     6 
     7     @GetMapping("buy")
     8     public String buyTicket(String name)
     9     {
    10         String s = ticketServiceFeign.getTicket();
    11         return name + "购买了" + s;
    12     }
    13 }

    启动项目输入http://127.0.0.1:2023/buy  进行测试。

     Feign说白了就是封装RestTemplate.

    细节补充

    SpringCloud_微服务完善_主机映射名称修改

    1、修改Eureka界面的Status值

     在provider-ticket 中application.yml中添加eureka.instance.instance-id指定名称即可

     重启,刷新Eureka界面

     为啥后面的DESKTOP-2OL88N3:provider-ticket:8002还没消失,后续会说,简单就是更改后有缓存,不会一下子注销。

    SpringCloud_微服务完善_主机IP信息提示

    访问路径从localhost转为ip地址;

    在项目中application.yml添加eureka.instance.prefer-ip-address: true

     Eureka界面显示:

    处理访问 http://192.168.100.110:8002/actuator/info Error Page

     1、provider-ticket项目pom.xml添加spring-boot-starter-actuator

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

    在application.yml配置中加入

    1 info:
    2   app.name: atg
    3   company.name: www
    4   build.artifactId: $project.artifactId$
    5   build.version: $project.version$

    这里的info就是url中的http://192.168.100.110:8002/actuator/info

    再次访问url,就不会出现Error Page了。

     其中$project.artifactId$ 是用来动态指定artifactId的表达式,需要配置过,这里不弄了。

    Eureka 自我保护机制

    出现以下红色字体即自我保护

     

     

     集群配置

     需要创建多个eureka服务器,集群。

    新建:eureka-server8762,eureka-server8763 服务

     然后就跟eureka-server配置一样

    不同的是端口号:

    //eureka-server8762
    server:
      port: 8762
    
    //eureka-server8763
    server:
      port: 8763

    配置好后发现一个就是hostname

    eureka:
      instance:
        hostname: eureka-server  #eureka实例的主机名

    3个项目中的hostname都一样,而我们现在为了动态hostname,把server-url:defaultZone的hostname绑定

    如下:

    server:
      port: 8761
    eureka:
      instance:
        hostname: localhost  #eureka实例的主机名
    
      client:
        register-with-eureka: false #不把自己注册到eureka上
        fetch-registry: false  #不从eureka上获取服务的注册信息,自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  #http://localhost:8761/eureka/ 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址

    修改yml配置后,Eureka网页的Application name则变为localhost

    其中${eureka.instance.hostname}就是上面配置的localhost

    由于3个项目启动后访问虽然端口不一样,但是主机名都一样,都是localhost,虽然都可以访问,但看起来不方便,即为了解决这个问题,需要域名映射。

    步骤:

    (1) C:WindowsSystem32driversetc

    (2) 找到hosts文件

    (3) 修改映射配置添加进hosts文件:

    127.0.0.1  qt8761.com
    127.0.0.1  qt8762.com
    127.0.0.1  qt8763.com

    修改项目yml配置,目前是集群配置,即8761端口的需要8762和8763,8762需要8761和8763,8763需要8761和8762

    如下

    server:
      port: 8761
    eureka:
      instance:
        hostname: qt8761.com  #eureka实例的主机名
    
      client:
        register-with-eureka: false #不把自己注册到eureka上
        fetch-registry: false  #不从eureka上获取服务的注册信息,自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          # http://${eureka.instance.hostname}:${server.port}/eureka/ #http://localhost:8761/eureka/ 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
          defaultZone: http://qt8762.com:8762/eureka/,http://qt8763.com:8763/eureka/
    server:
      port: 8762
    
    eureka:
      instance:
        hostname: qt8762.com  #eureka实例的主机名
    
      client:
        register-with-eureka: false #不把自己注册到eureka上
        fetch-registry: false  #不从eureka上获取服务的注册信息,自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          defaultZone: http://qt8761.com:8761/eureka/,http://qt8763.com:8763/eureka/
    server:
      port: 8763
    
    eureka:
      instance:
        hostname: qt8763.com  #eureka实例的主机名
    
      client:
        register-with-eureka: false #不把自己注册到eureka上
        fetch-registry: false  #不从eureka上获取服务的注册信息,自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        service-url:
          defaultZone: http://qt8761.com:8761/eureka/,http://qt8762.com:8762/eureka/

    配置完后,我们再看provider-ticket项目中的

    eureka:
      instance:
        prefer-ip-address: true #注册服务的时候使用服务的ip地址
        instance-id: PROVIDER-TICKET8002
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/

    defaultZone配置了单机版的http://localhost:8761/eureka/,现在是集群,肯定不止一个了,需要全部注入才行

    如下:

    eureka:
      instance:
        prefer-ip-address: true #注册服务的时候使用服务的ip地址
        instance-id: PROVIDER-TICKET8002
      client:
        service-url:
          defaultZone: http://qt8761.com:8761/eureka/,http://qt8762.com:8762/eureka/,http://qt8763.com:8763/eureka/

    3台全部注入

    最后分别启动8761、8762、8763服务,以及provider-ticket服务。

    由于改了端口映射,访问的url地址为http://qt8761.com:8761/

     发现DS Replicas中多了qt8763.com和qt8762.com,就这是集群。

    访问http://qt8762.com:8762/http://qt8763.com:8763/ 道理一样,不再写出。

  • 相关阅读:
    ◆ C++中通过溢出覆盖虚函数指针列表执行代码
    关于在OnTimer中连续弹出对话框的讨论
    SetTimer
    Windows内核对象
    日志收缩
    暴力求值
    低级问题
    函数限制
    字符串找字段和表
    android错误提示说明汇总
  • 原文地址:https://www.cnblogs.com/zjtao/p/12286973.html
Copyright © 2020-2023  润新知