微服务架构集大成者,云计算最佳实践,搭建分布式、微服务项目的一站式框架
主要用来实现服务的注册、发现
@EnableEurekaServer //标记这是注册中心
#端口号
server:
port: 8761
eureka:
instance:
#主机名称
hostname: localhost
client:
#自身不注册
registerWithEureka: false
#不发现自身服务
fetchRegistry: false
serviceUrl:
#访问地址,高可用,支持集群,多个之间,隔开
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
#服务名称,强烈建议给每一个服务起个名字,含义为服务,要求不重复,这样就好区分
name: server1803
注:测试时,一个项目中模拟启动多个注册中心,可copy启动方式(左上角减号右边按钮),在环境配置中Vm Options框填写:
-Dserver.port=8762
在yml的servicelUrl中配置集群,采用逗号隔开,当然,这里引用就不能写相同的端口了。
验证: http://localhost:8761
@EnableEurekaClient //标记这是客户端,提供者
#设置端口
server:
port: 9761
#连接数据库
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/sswd?useSSL=false
username: root
password: 123
type: com.alibaba.druid.pool.DruidDataSource
application:
name: provider1803
#注册中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
因为springcloud的提供者提供的是接口,所以正常的书写mapper、service、controller的代码即可
等下需要在消费端service层配置映射的接口地址
验证:
点击后边的地址,得到如下
去掉后边的actuator/info,在地址后拼接上接口地址:
在实际开发中,都是指定前段域名部分为一个固定名称(需要配置),通过ip域名等方式访问,如:
http://kam1996:9691/wordlist.do?flag=1
注意:虽然这是数据接口,返回的是xml格式数据。但请不要直接在消费者中直接访问此路径,直接访问就相当于没走注册中心,也就 没有实现服务的发布与消费。
2、在启动类上注解:
@EnableEurekaClient//客户端 @EnableDiscoveryClient//发现服务
3、在application.yml中配置:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: ribbon1803
server:
port: 10762
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced //启用负载均衡
public RestTemplate createTem(){
//交由ioc管理RestTemplate对象
return new RestTemplate();
}
}
@Service
public class HiService {
//注入ioc创建的resttemplate对象,由此对象的方法获取数据
@Autowired
private RestTemplate restTemplate;
public String hi(){
//get请求通过get开头的方法,post通过post开头的方法,根据返回值不同,选择不同的方法即可
//这里的请求地址使用http://server-name,来代替http://ip:port,因为在ribbon中它会根据
// 服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名,这里请求的是http://provider1803/hello.do
return restTemplate.getForObject("http://PROVIDER1803/hello.do",String.class);
}
}
@EnableEurekaClient//标记客户端
@EnableDiscoveryClient//发现服务
@EnableFeignClients//消费者模板
#注册中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
#服务名称
name: feign1803
server:
#端口
port: 10761
3、除了service层代码与之前有点不同,其他一样:
@FeignClient(value = "provider1803")
public interface WordService {
@RequestMapping(value = "/wordsave.do",method = RequestMethod.POST)
public R save(@RequestBody Word word);
@RequestMapping(value = "/wordlist.do",method = RequestMethod.GET)
public List<Word> list(@RequestParam(value = "flag") int flag);
}
解释注解:
@FeignClient(value = “provider1803”):
指明将要消费的服务名称
@RequestMapping(value = “/wordsave.do”,method = RequestMethod.POST):
指明提供者的controller中,书写的对应的数据接口,value和method要与提供者一致
方法,而方法的方法名和参数返回值等皆与提供者的方法参数返回值一致。在于对象上加上了@RequestBody 这样消费者才能访问到提供者接口。即两者之间是json格式传输的
@RequestParam(value = “flag”):
指定参数
这里要提到@ResponseBody 注解,此 让我们的控制器不在调用viewresolve,而只是一个标记。至于消费接口返回的数据还是xml,我们可以在mapping注解里加上参数:
produces = "application/json"
即可返回 json 格式的数据
http://localhost:10761/wordall.do?flag=1