一。SpringCloud项目简介
1.SpringCloud项目可划为三个角色,一个是服务的注册与发现中心(Eureka )
,一个是服务的提供方(Provider)
,最后一个是服务的消费方(Consumer)
,首先我们要保证Eureka能够正常的运行,让Provider在Eureka上注册服务,然后Consumer就能够在Eureka上发现Provider服务,并可以通过RPC远程调用的方式对Provider服务进行调用,这就是一个简单的微服务结构模型。结构图如下所示:
如果你还没有听懂的话,再举一个例子来说明吧:
网购现如今已经变成了我们日常生活中不可或缺的部分,我们可以在某些购物平台上根据自己的需要来进行购买。在这个例子中,我们可以把某购物平台
类比成一个Eureka,把商家
类比成一个Provider,把买家
类比成一个Consumer。只有当购物平台正常运作,且商家在该平台进行注册的情况下,买家才能够在该购物平台中搜索到相关商家的产品信息,并进行购买消费。结构图如下所示:
示例项目结构如下:
- springcloud_demo:项目名称
- eureka-server:服务注册与发现子模块
- provider:服务提供子模块
- consumer:服务消费子模块
二。构建步骤
1.构建一个maven项目:
输入项目名称以及所在位置,这里我是用springcloud_demo作为项目名称:
删除新建项目下的src文件夹,因为我们只需要新建项目的架子,让其存放其他的子服务:
2.新建Eureka注册中心子模块:eureka-server
选择Spring Initializr:
填写项目名称eureka-server,选择java版本,这里我选的是java8版本:
选择Spring Cloud Discovery,勾选Eureka Server:
确认子模块名称以及所在位置:
导入依赖:
创建成功效果图:
3.创建提供服务子模块:provider
,除了Spring Cloud Discovery中勾选Eureka Discovery Client外,创建方式与创建eureka-server子模块方式一致
4.创建服务消费子模块:consumer
,除了Spring Cloud Discovery中勾选Eureka Discovery Client外,创建方式与创建eureka-server子模块方式一致
5.构建完成后项目结构如下:
三。服务调用
1.eureka-server子模块:
在该启动类中加上@EnableEurekaServer
注解,声明为注册中心:
package com.example.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
//启动类标识
@SpringBootApplication
//声明为注册中心
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
把resources下的application.properties文件名改为application.yml
(快捷键:shift+f6),并添加以下内容:
server:
#运行端口
port: 8888
eureka:
instance:
#注册ip
hostname: localhost
client:
#禁止自己当做服务注册
register-with-eureka: false
#屏蔽注册信息
fetch-registry: false
#注册url
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
2.provider子模块:
在该启动类中加上@EnableEurekaClient
注解,声明为注册服务:
package com.example.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
//启动类标识
@SpringBootApplication
//声明为注册服务
@EnableEurekaClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
把resources下的application.properties文件名改为application.yml
(快捷键:shift+f6),并添加以下内容:
eureka:
client:
serviceUrl:
#服务注册地址
defaultZone: http://localhost:8888/eureka/
server:
#运行端口
port: 8763
spring:
application:
#服务注册名称
name: service-provider
新建controller包,并新建控制器类TestController
示例:
package com.example.provider.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description:服务端控制器
* @Author :zks
* @Date :16:07 2020/8/27
*/
@RequestMapping("test")
@RestController
public class TestController {
@RequestMapping("getName")
public String getName(){
return "SpringCloud!";
}
}
完成后子模块结构如下:
3.consumer子模块:
在该启动类中加上@EnableEurekaClient
注解,声明为注册服务:
package com.example.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
//启动类标识
@SpringBootApplication
//声明为注册服务
@EnableEurekaClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
把resources下的application.properties文件名改为application.yml
(快捷键:shift+f6),并添加以下内容:
eureka:
client:
serviceUrl:
#服务注册地址
defaultZone: http://localhost:8888/eureka/
server:
#运行端口
port: 8764
spring:
application:
#服务注册名称
name: service-consumer
调用方式一:使用RestTemplate调用注册子模块接口方法
新建service包,并新建一个ConsumerService
类:
package com.example.consumer.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* @Description:使用RestTemplate调用注册子模块接口方法
* @Author :zks
* @Date :16:14 2020/8/27
*/
@Service
public class ConsumerService {
@Autowired
private RestTemplate restTemplate;
public String getName() {
//调用子模块接口地址
String name = restTemplate.getForObject("http://service-provider/test/getName", String.class);
return name;
}
}
在启动类中加入以下代码,把RestTemplate注入到Spring容器中:
//把RestTemplate注入到Spring容器中(不然会找不到该RestTemplate类)
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
调用方式二:使用@FeignClient注解调用注册子模块接口方法
在service包下新建一个ConsumerService1
类:
package com.example.consumer.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @Description:使用@FeignClient注解调用注册子模块接口方法
* @Author :zks
* @Date :16:31 2020/8/27
*/
//注册子模块名称
@FeignClient(value = "service-provider")
public interface ConsumerService1 {
//接口访问地址
@GetMapping("test/getName")
public String getName1();
}
在启动类中加入@EnableFeignClients
注解,把调用注册子模块接口引入到Spring容器中:
//把调用注册子模块接口引入到Spring容器中(不加此注解会出现找不到@FeignClient修饰的接口)
@EnableFeignClients
含有两种调用方式的启动类:
package com.example.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
//启动类标识
@SpringBootApplication
//声明为注册服务
@EnableEurekaClient
//把调用注册子模块接口引入到Spring容器中(不加此注解会出现找不到@FeignClient修饰的接口)
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
//把RestTemplate注入到Spring容器中(不然会找不到该RestTemplate类)
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
新建controller包,并新建控制器类ConsumerController
:
package com.example.consumer.controller;
import com.example.consumer.service.ConsumerService;
import com.example.consumer.service.ConsumerService1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description:消费端控制器
* @Author :zks
* @Date :16:18 2020/8/27
*/
@RequestMapping("consumer")
@RestController
public class ConsumerController {
@Autowired
private ConsumerService consumerService;
@Autowired
private ConsumerService1 consumerService1;
/**方式一:RestTemplate调用
* @return
*/
@RequestMapping("getName")
public String getName(){
return consumerService.getName();
}
/**
* 方式二:@FeignClient调用
* @return
*/
@RequestMapping("getName1")
public String getName1(){
return consumerService1.getName1();
}
}
完成后子模块结构如下:
注意,若修改的application.yml文件中含中文注释的话,需要将其编码格式转换成utf-8,要不然可能读取该文件出错,导致子模块启动失败:
四。服务启动
1.首先启动eureka-server
找到该子模块的启动类,启动该模块:
启动成功:
在浏览器中输入:localhost:8888
,出现Eureka注册中心管理页面:
2.然后启动provider-server
找到该子模块的启动类,启动该模块:
启动成功:
刷新Eureka注册中心管理页面:
3.最后启动consumer-server
找到该子模块的启动类,启动该模块:
启动成功:
刷新Eureka注册中心管理页面:
至此相关服务以及全部启动完成。
五。访问消费端接口
1.在浏览器中输入:http://localhost:8764/consumer/getName
,成功得到返回结果:
2.在浏览器中输入:http://localhost:8764/consumer/getName1
,成功得到返回结果:
该demo已上传,有需要的小伙伴可以自行下载:springcloud_demo