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 }
如果出现以下页面说明配置安装成功。
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:\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/ 道理一样,不再写出。