spring cloud笔记2


简介

项目运用

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

idea 先创建个Empty Project

2、创建eureka-server文件项目

 选择Spring Cloud Discovery -> Eureka Server

pom.xml 新增


       org.springframework.cloud
       spring-cloud-starter-netflix-eureka-server

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 
2     org.springframework.cloud
3     spring-cloud-starter-feign
4     1.4.1.RELEASE
5 

在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


       org.springframework.boot
       spring-boot-starter-actuator

在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:\Windows\System32\drivers\etc

(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/ 道理一样,不再写出。

相关